2012-06-27 3 views
3
는 기본적으로 나는이 포함 된 DataContract

Dictionary : 나는를 단순화 할 수 있습니다 방법사용자 정의 직렬화

<Data> 
<a:KeyValueOfstringanyType> 
    <a:Key>ID</a:Key> 
    <a:Value i:type="s:int">2</a:Value> 
</a:KeyValueOfstringanyType> 
<a:KeyValueOfstringanyType> 
    <a:Key>Value</a:Key> 
    <a:Value i:type="s:int">4711</a:Value> 
</a:KeyValueOfstringanyType> 
</Data> 

: 여기

[DataContract] 
public class MyDictionary : IDictionary<string, object> { 
    [DataMember(Name = "Data")] 
    protected IDictionary<string, object> Dictionary { get; private set; } 

    // ... 
} 

는 XML 출력의와 관계있는 부분입니다 다음과 같이 출력 :

<Data> 
    <ID i:type="s:int">2</ID> 
    <Value i:type="s:int">4711</Value> 
</Data> 

사전 ke y는 문자열로 제한되므로 아무도 잘 작동하지 않는 비 ASCII 키를 사용하는 어리석은 아이디어를 얻지 못한다. CollectionDataContract이라는 속성을 발견했는데 원하는 부분에 조금 더 가깝지만 키 값 쌍이 저장되어 메모리를 낭비합니다. 어쩌면 클래스 ISerializable으로 슬블 할 수는 있지만 DataContractSerializer에 문제가 있는지 확실하지 않습니다. 그런데 솔루션도 DataContractJsonSerializer과 함께 작동해야합니다.

+0

이렇게 조숙 한 최적화의 경우가 아닐까요? 필자는 DataContracts와 serializer/deserializers가 두통을 피할 수있는 곳에서 자신의 일을하는 경향이있다. –

+0

@ChrisSinclair 많은 키 값 쌍이있을 수 있으며 JSON 형식의 Android 클라이언트로 해당 항목을 읽습니다. 지금까지 나는 일이 합리적이어야한다고 생각합니다. – rekire

+0

이 경우 XML 직렬 변환기가 아닌 JSON 직렬 변환기를 사용 하시겠습니까? 그렇다면 아마도 JSON 시리얼 라이저를 붙이고 그 결과를 보는 것이 가치가있을 것입니다. (아마도 이미 충분히 최적화되어있다.) 또한, XML을 유지하려면, ID/Value 주위에 어떤 종류의'Entry' 래퍼가 있어야 할 것이므로, 여러 KeyValuePairs를 가질 수있다. '012 : ID : type = "s : int"> 2 <값 i : 유형 = "s : int"> 4711 편집 : 죄송합니다, 나는 그것이 작동되기를 바라는 마지막 문장을 발견하지 못했습니다. JSON 및 XML 시리얼 라이저 모두를 지원합니다. –

답변

1

당신이 겪고있는 문제는 IDictionary < KeyValuePair < '문자열, 객체의 문자열, 객체> <이 (방식)을 IEnumerable있다'는 사실 >>에서 온다, 그는 DataContractSerializer 각 KeyValuePair의 개성을 직렬화 방법입니다.

정확히 이해한다면 사용자 지정 직렬화를 만드는 것이므로 IXmlSerializable 인터페이스를 구현할 수 있습니다.

WriteXml 및 ReadXml 함수를 사용하면 XmlWriter가 매개 변수로 전달 된 스트림에 기록 된 xml을 제어 할 수 있습니다. 예

이 함수

public void WriteXml(XmlWriter writer) 
    { 
     foreach (var pair in _dictionary) 
     { 
      writer.WriteElementString("Key", pair.Key); 
      writer.WriteElementString("Value", pair.Value.ToString()); 
     } 
    } 

이 결과 두 쌍 가정

<MyDictionary xmlns="http://schemas.datacontract.org/2004/07/Sandbox"> 
    <Key>ID</Key> 
    <Value>15</Value> 
    <Key>Value</Key> 
    <Value>123</Value> 
</MyDictionary> 

를 산출 할 것이다가 사전 (ID 15 & 값, 123)에 입력하고있다.

오, JSON에 대해서는 IJsonSerializable이 있지만 그 작업을 한 번도 해보지 않았습니다.

+0

Unforchantly 나는 새로운 일자리를 얻었고 더 이상 WCF를 사용하지 않지만, 당신은 대답이 매우 논리적이고 의미가 있습니다. 완성을 위해서'IXmlSerializable' 인터페이스가 어떻게 구현되어야하는지,이 시리얼 라이저가 어떻게 사용되는지를 예제를 확장 할 수 있을까요? 지금까지 +1. – rekire

관련 문제