2010-06-24 2 views
4

Мне нужна помощь, у меня есть данные, поступающие в xml, я хочу сделать объект из него, сделать что-то с ним, сериализовать его обратно и отправить его ... , но это должно быть своего рода пользовательская сериализация.custom xml serialization

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() 
    {} 
} 

ответ

7

XmlMagic вы после того, как называется IXmlSerializable интерфейс: http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

Он предоставляет вам 2 способами ReadXml и WriteXml, где вам нужно выполнить чтение вашего объекта и записать его b извед. Затем вы используете стандартный .Net XmlSerializer для сериализации/десериализации объектов.

Дайте мне знать, если вам нужна дополнительная помощь.

4

Однако есть и XML сериализации Атрибуты как

[XmlAttribute] 
[XmlArrayElement] 
[XmlRoot] 

и т.д., вы можете даже использовать эти атрибуты для управления вашей сериализации и получения идеальной, что вы хотите без написания сложной логики сериализации.

0

Возможно, вы захотите проверить комплект стартеров WCF REST; так как он включает визуальную студию add в названии «Paste XML as Type»

В основном, вы копируете свой необработанный 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; 
     }