2016-06-06 12 views
2

사용자 지정 클래스를 XML로 serialize하려고합니다. 여기XmlSerializer가 클래스에 정의 된 XmlRoot를 사용하지 않습니다.

[Serializable()] 
[XmlRoot("KVP")] 
public class SerializableKeyValuePair<TKey, TValue> 
{ 

    public SerializableKeyValuePair() 
    { } 

    public SerializableKeyValuePair(TKey key, TValue value) 
    { 
     Key = key; 
     Value = value; 
    } 

    public TKey Key { get; set; } 
    public TValue Value { get; set; } 

} 

직렬화하려고 시도하는 코드입니다 : 여기

var xmlWriter = new StringWriter(); 
    Type[] extraTypes = new Type[1] { typeof(SerializableKeyValuePair<string, string>) }; 
    var xmlSerializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>), extraTypes); 
    xmlSerializer.Serialize(xmlWriter, functions); 
    xmlRet = xmlWriter.ToString(); 

을 그리고 실제 결과 다음은 클래스입니다 내가보고 싶은 무엇

<ArrayOfSerializableKeyValuePairOfStringString> 
    <SerializableKeyValuePairOfStringString> 
     <Key>Min</Key> 
     <Value>Min</Value> 
    </SerializableKeyValuePairOfStringString> 
    <SerializableKeyValuePairOfStringString> 
     <Key>MinAvgMax</Key> 
     <Value>MinAvgMax</Value> 
    </SerializableKeyValuePairOfStringString> 
</ArrayOfSerializableKeyValuePairOfStringString> 

다음과 같습니다,하지만 내가 정의한 XmlRoot를 사용하지 않는 것 같습니다. 누구든지이 XML 구조를 얻는 방법을 알아낼 수 있습니까?

<ArrayOfKVP> 
    <KVP> 
     <Key>Min</Key> 
     <Value>Min</Value> 
    </KVP> 
    <KVP> 
     <Key>MinAvgMax</Key> 
     <Value>MinAvgMax</Value> 
    </KVP> 
</ArrayOfKVP> 

TIA!

답변

1

그러나 SerializableKeyValuePair은 루트가 아니기 때문에 List<SerializableKeyValuePair<string, string>>은!

[XmlType("KVP")] 
public class SerializableKeyValuePair<TKey, TValue> 
{ 
    //... 
} 

을 그리고 당신은 당신의 목록 요소 이름을 변경하려면 시리얼 라이저 만들 때, 당신은 XmlRootAttribute을 제공 할 수 있습니다 :

나는 당신이 XmlType 찾고있는 생각

var serializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>), 
    null, extraTypes, new XmlRootAttribute("ArrayOfKVP"), string.Empty); 

을 제쳐두고, SerializableXmlSerializer과 아무 관련이 없습니다. 다른 목적으로 필요하지 않으면 제거 할 수 있습니다.

+0

그것을했다! 그게 내 뿌리가 아니라는 것을 알았지 만 문서에서 클래스 수준에서 XmlElement를 사용할 수 없다고 말했고 XmlType이 무엇인지에 대해 오해했습니다. 나를 똑바로 세워 줘서 고마워! – VG1

0

첫째, 당신은 serializztion

var xKVP = xDoc.Root.Descendants().FirstOrDefault(d => d.Name.LocalName.Equals("car")); 

var serializer = new XmlSerializer(typeof(SerializableKeyValuePair<string, string>)); 
using (var reader = xKVP.CreateReader()) 
{ 
    var result = (SerializableKeyValuePair<string, string>) serializer.Deserialize(reader); 
    Console.WriteLine(result.Key); 
    Console.WriteLine(result.Value); 
} 

또 다른 방법 전에 KVP의 배열을 선택하려고 할 수 있습니다, 당신은 당신의 배열의 래퍼를 만들 수 KVP의

[XmlRoot("ArrayOfKVP")]  
class ArrayOfKVP 
{ 
    public ArrayOfKVP() {} 

    [XmlElement("KVP")] 
    public List<Foo> KVPList {get; set;} 
} 

[Serializable()] 
[XmlType("KVP")] 
public class SerializableKeyValuePair<TKey, TValue> 
{ 

    public SerializableKeyValuePair() 
    { } 

    public SerializableKeyValuePair(TKey key, TValue value) 
    { 
     Key = key; 
     Value = value; 
    } 

    public TKey Key { get; set; } 
    public TValue Value { get; set; } 
} 
+0

답변 해 주셔서 감사합니다. 첫 번째 옵션은 나에게 적합하지 않으며 두 번째 옵션은 Array 클래스가 키와 값의 데이터 유형을 알아야하기 때문에 작동하지 않습니다. 기존의 직렬화 기술을 사용하고 싶습니다만 XmlRoot를 사용하면 으로 바꾸는 것이 왜 효과적이지 않은지 이해할 수 없습니다. – VG1