避免在xml序列化期间序列化私有数据库

时间:2013-03-28 02:05:16

标签: c# wcf

我有一个如下所示的数据提取:

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

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

提前感谢。

2 个答案:

答案 0 :(得分:2)

您的私有成员写入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

答案 1 :(得分:1)

除了使用DataContractSerializer而不是XmlSerializer之外,我做了类似于Andark的回答。这是在针对.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]标记私有字段或成员,则会将其序列化。< / p>