2010-06-24 102 views
4

我需要帮助,我有一些数据进来的XML,我想做一个对象,做一些事情,将它序列化并发送出去... 但它必须是某种自定义序列化。自定义xml序列化

XML,如:

<Animals Ver="12" class="1" something="2"> 
    <Dog Ver="12" class="2" something="17"> 
     <Name> a </Name> 
     <Sound> oof </Sound> 
     <SomeOtherProp>12</SomeOtherProp> 

    </Dog> 
    <Cat Ver="12" class="3" something="4"> 
     <Name> b </Name> 
     <Sound> meow </Sound> 
    </Cat> 
</Animals> 

需求将呈现为:

abstract class Animal :XmlMagic 
{ 
    public string Name{get;set;} 
    public string Sound{get;set;} 

    public void SomeMagicalXMLSerializationMethod() 
    {} 
    public void SomeMagicalXMLDeSerializationMethod() 
    {} 
} 

class Dog: Animal, XmlMagic 
{ 
    public int SomeOtherProp{get;set;} 
    public void SomeMagicalXMLSerializationMethod() 
    {} 
    public void SomeMagicalXMLDeSerializationMethod() 
    {} 
} 

回答

4

但也有XML序列化的属性,如

[XmlAttribute] 
[XmlArrayElement] 
[XmlRoot] 

等,你甚至可以使用这些属性来控制自己的序列化和acheive你想要什么,而无需编写复杂的序列化逻辑。

0

您可能想查看WCF REST Starter Kit;因为它包含一个名为“将XML粘贴为类型”的视觉工作室添加内容

基本上,您复制原始XML,然后选择该选项;它会根据该XML为您生成一个类。然后你可以做一些简单的事情:

var xmlResponse = new XmlDocument(); 
xmlResponse.LoadXml(response); 
var deserializedResponse = ConvertNode<ResponseWrapper.response>(xmlresponse); 

public static T ConvertNode<T>(XmlNode node) where T : class 
     { 
      var stm = new MemoryStream(); 

      var stw = new StreamWriter(stm); 
      stw.Write(node.OuterXml); 
      stw.Flush(); 

      stm.Position = 0; 

      var ser = new XmlSerializer(typeof(T)); 
      var result = (ser.Deserialize(stm) as T); 

      return result; 
     }