2014-12-02 56 views
0

我很新的XML序列化/反序列化,我想知道如何应用标签(XmlElement,XmlAttribute等)到我正在写入XML文件的以下对象,使其最适合我以后使用LINQ或类似的工具来获取我想要的数据。让我举一个例子:从我的XML获取信息

[XmlRoot("Root")] 
    public class RootObject 
    { 
     public Services Services { get; set; } 
    } 

    public class Services 
    { 
     public Service TileMapService { get; set; } 
    } 

    public class Service 
    { 
     public string Title { get; set; } 
     public string href { get; set; } 
    } 

在这里,我定义的一些特性,我打算写为XML的一些值我会在以后添加。在这一点上,我硬编码的值这个方法:

public static void RootCapabilities() 
    { 
     RootObject ro = new RootObject() 
     { 
      Services = new Services() 
      { 
       TileMapService = new Service() 
       { 
        Title = "Title", 
        href = "http://something" 
       } 
      } 
     }; 

这让我这个XML输出:

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Services> 
    <TileMapService> 
     <Title>Title</Title> 
     <href>http://something</href> 
    </TileMapService> 
    </Services> 
</Root> 

我的问题是,如果这是这样做,或者如果一个有效途径我必须使用'XmlElement'和'XmlAttribute'标记来稍后反序列化这个XML文件,并从中获取我想要的信息(例如'title')。

我还不确定如何写这个问题,所以请让我知道它是否太含糊。

回答

1

如果我是你,我不会使用XML序列化。由于XML序列化作为一种​​技术的方式,对模式/对象结构的任何更改都会立即失去向后兼容性。

将XML序列化从实际的类结构中分离出来 - 这样,您可以对XML /对象模式进行更改,并编写适当的迁移函数来处理您将来所做的任何更改。

而是使用LINQ-to-XML类构造XML文档并保存它,因为它们是.NET中以分离方式将对象结构转换为XML的最简单方法。

1

如果输出结果是你期望的,我认为你不应该改变任何东西。

当你要更改默认的行为,你应该用装饰像XmlAttributeXmlIgnore(如不包括场,包括一个字段作为一个属性...)

它们的作用是获得完全控制序列化和避免意外的行为

1

如果你不想担心序列化的本质,XmlSerializer一直对我很好。

public static void SerializeObject(T obj, string file) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    TextWriter w = new StreamWriter(file); 
    s.Serialize(w, obj); 
    w.Close(); 
} 

public static T DeserializeObject(string file) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    using (StreamReader r = new StreamReader(file)) 
    { 
     return (T)s.Deserialize(r); 
    } 
} 

这应该只用于引用类型虽然(对象,而不是原始类型或结构)。 Deserialize可以返回null,并将其转换为值类型只会带来心痛。