避免XML序列化时序列化私有数据成员

避免XML序列化时序列化私有数据成员

问题描述:

我有一个datacontract象下面这样:避免XML序列化时序列化私有数据成员

[DataContract] 
class Person 
{ 
    private string m_name; 
    [DataMember] 
    public string Name 
    { get {return m_name;} 
     set {m_name = value;} 
    } 
} 

当XML序列化序列化这个对象,它生成具有私有成员XML像

<person><m_name>john</m_name></person> 

如何强制序列化程序只序列化公共属性。

在此先感谢。

+0

可能重复[C#DataContract属性为私有字段?](http://stackoverflow.com/questions/8883615/c-sharp-datacontract-attribute-for-private-fields) – Romoku 2013-03-28 02:25:25

+0

DataContrac使用的DataContractSerializer,不XmlSerializer的,除非否则你已经告诉过它。它们是有区别的。 – Tim 2013-03-28 05:59:28

+0

由于'XmlSerializer'和'DataContractSerializer'都给出了预期的答案,是否有可能用'[DataMember]'属性而不是'Name'装饰了'm_name'?由于名称没有出现在您发布的XML中,但m_name的确是...... – Tim 2013-03-28 06:39:55

奇怪的是,您的私人成员写入XML。我试图模仿你的情况和串行只写了公共领域:

 
    [DataContract] 
    public class Person 
    { 
     private string m_name; 
     [DataMember] 
     public string Name 
     { 
      get { return m_name; } 
      set { m_name = value; } 
     } 
    }

private void Form1_Load(object sender, EventArgs e) { var person = new Person() {Name = "john"}; var xs = new XmlSerializer(typeof(Person)); var sw = new StreamWriter(@"c:\person.xml"); xs.Serialize(sw, person); }

您还可以阅读:http://msdn.microsoft.com/en-us/library/83y7df3e%28VS.71%29.aspx

+0

恕我直言,我不相信这个答案根据他发布的代码来解决OP的问题。他使用'[DataContract]'而不是'[Serializable]',因此将使用DataContractSerializer,其行为与XmlSerializer不同。 – Tim 2013-03-28 07:45:27

我做了类似Andark的答案的东西,除了我用DataContractSerializer代替XmlSerializer。这是在VS 2012中针对.NET 4.5完成的。

下面是测试代码:

using Sytem; 
using System.IO; 
using System.Runtime.Serialization; 

namespace ConsoleApplication1 
{ 

    class Program 
    { 

     static void Main(string[] args) 
     { 

      Person myPerson = new Person() { Name = "Tim" }; 

      using (FileStream writer = new FileStream("Person.xml", FileMode.Create, FileAccess.Write)) 
      { 

       DataContractSerializer dcs = new DataContractSerializer(typeof(Person)); 
       dcs.WriteObject(writer, myPerson); 
      } 
     } 
    } 

    [DataContract] 
    class Person 
    { 

     private string m_name; 

     public string Name 
     { 
      get 
      { 
       return m_name; 
      } 
      set 
      { 
       m_name = value; 
      } 
     } 
    } 
} 

当我运行它,我得到以下XML:

<Person xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1" 
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Name>Tim</Name> 
<Person> 

这是什么预期。

需要注意的是为DataContract的默认的序列是DataContractSerializer是很重要的,XmlSerializer,并有一定的差异。只有被标记为[DataMember]的会员应该被序列化,并且访问级别(私人,公共等)是不相关的 - 如果您使用[DataMember]标记私人字段或成员,它将被序列化。