我有一个如下所示的数据提取:
[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 :(得分: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>