class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
简单的问题但是在尝试回答它时似乎是一团糟 每个人都建议使用公共getter / setter,但我的应用程序太大,为每个成员制作一个getter / setter只会导致可维护性问题。
我是否被迫在这里创建自定义序列化,或者这些成员是否有魔法属性? 如何序列化私有类成员?
编辑#1 :
大家好,对不起来感到抱歉,当我写这个问题时,我有点不高兴,试图找到解决方案几个小时后。
无论如何,这里有更多的事实:
我正在尝试XML序列化这个类。 目前我正在使用System.Xml.Serialization.XmlSerializer
。
2.我序列化为XML以具有版本兼容性,据我所知,二进制文件不能提供给我。
我希望有一个属性,如:
class Person
{
public string m_name;
[SerializeThat(ElementName="Age")]
private int m_age; // << how do I serialize the darn little rat?
}
或(继续事实#3)一个属性,该类属于类,如下所示:
[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
现在,我该怎么做才能实现它?
答案 0 :(得分:17)
假设输入错误,我想将您重定向到this SO article,其中解决方案是使用DataContractSerializer
。
答案 1 :(得分:8)
如果您使用BinaryFormatter
,它将用于您班级的私人部分。
用[Serializable]标记你的每个班级,否则你不会走得太远......
另外,请看一下:Why is Serializable Attribute required for an object to be serialized
由于您需要XML,也许您可以使用SoapFormatter
来完成所有操作。看到
this
Apropos版本兼容性:我使用BinaryFormatter
并且在架构升级方面没有任何问题。请尝试一下:您可以自己处理架构更改,我们只需使用适当的默认构造替换Deserialize
遗漏的空指针。如果你真的不需要XML提供的功能,那就去二进制 - 你永远不会回头。
另外,还有一个编辑:
BF将很快解析所有多个引用,因此它不会反复创建相同引用的多个实例。猜猜你不会用XmlSerializer
得到它 - 显然它没有地方存储这些信息。
示例:
class Data
{
int a;
}
class ManyData
{
Data d1;
Data d2;
}
...
ManyData md=new ManyData();
md.d1=new Data();
md.d2=md.d1;
尝试使用多种替代方法序列化/反序列化md
...
答案 2 :(得分:7)
不知道您是否可以使用DataContract
。但有了这个,你可以写:
[DataContract]
class Person
{
[DataMember]
public string m_name;
[DataMember]
private int m_age;
}
您可以序列化私有字段和类的DataContract的优点是不需要默认构造函数。
答案 3 :(得分:5)
您目前使用的是哪种序列化程序?几乎所有人都应该这样做。但公共领域* *是一个坏主意。 XmlSerializer和JavaScriptSerializer将忽略私有成员。 DataContractSerializer和protobuf-net 可以处理私人成员。 BinaryFormatter处理字段(公共或私人),但出于多种原因,IMO并不是一个好主意。
答案 4 :(得分:2)
ISerializable的? http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
答案 5 :(得分:0)
您最好编写自定义序列化程序
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
答案 6 :(得分:0)
使用IXmlSerializable
界面和要序列化的控制字段:
public interface IXmlSerializable
{
XmlSchema GetSchema();
void ReadXml(XmlReader reader);
void WriteXml(XmlWriter writer);
}