【问题标题】:Avoid serializing private datamembers during xml serialization避免在 xml 序列化期间序列化私有数据成员
【发布时间】:2013-03-28 14:33:21
【问题描述】:

我有一个如下的数据合同:

[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>

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

提前致谢。

【问题讨论】:

  • DataContrac 使用 DataContractSerializer,而不是 XmlSerializer,除非您另有说明。有区别。
  • 由于XmlSerializerDataContractSerializer 都给出了预期的答案,您是否真的可以用[DataMember] 属性而不是Name 来装饰m_name?由于 Name 没有出现在您发布的 XML 中,但 m_name 出现了....
  • 请贴出你用来序列化类对象的代码。

标签: c# wcf


【解决方案1】:

奇怪的是你的私有成员写入 xml。我试图模仿你的情况,序列化器只写了公共字段:

[数据合约] 公共类人 { 私有字符串 m_name; [数据成员] 公共字符串名称 { 得到 { 返回 m_name; } 设置 { m_name = 值; } } } 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

【讨论】:

  • 恕我直言,我不相信这个答案根据他发布的代码解决了 OP 的问题。他使用的是[DataContract],而不是[Serializable],因此将使用DataContractSerializer,其行为与XmlSerializer不同。
【解决方案2】:

我做了类似于 Andark 的回答,只是我使用了 DataContractSerializer 而不是 XmlSerializer。这是在针对 .NET 4.5 的 VS 2012 中完成的。

这是测试代码:

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],它将被序列化。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多