避免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>
如何强制序列化程序只序列化公共属性。
在此先感谢。
奇怪的是,您的私人成员写入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
恕我直言,我不相信这个答案根据他发布的代码来解决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]
标记私人字段或成员,它将被序列化。
可能重复[C#DataContract属性为私有字段?](http://stackoverflow.com/questions/8883615/c-sharp-datacontract-attribute-for-private-fields) – Romoku 2013-03-28 02:25:25
DataContrac使用的DataContractSerializer,不XmlSerializer的,除非否则你已经告诉过它。它们是有区别的。 – Tim 2013-03-28 05:59:28
由于'XmlSerializer'和'DataContractSerializer'都给出了预期的答案,是否有可能用'[DataMember]'属性而不是'Name'装饰了'm_name'?由于名称没有出现在您发布的XML中,但m_name的确是...... – Tim 2013-03-28 06:39:55