class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
Run Code Online (Sandbox Code Playgroud)
简单的问题,但在尝试回答它时似乎是一个很大的混乱.
每个人都建议使用公共getter/setter,但我的应用程序太大,为每个成员制作一个getter/setter只会导致可维护性问题.
我是否被迫在这里创建自定义序列化,或者这些成员是否有魔术属性?
如何序列化私有类成员?
编辑#1:
大家好,对不起来感到抱歉,当我写这个问题时,我有点不高兴,试图找到解决方案几个小时后.
无论如何,这里有更多的事实:
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?
}
Run Code Online (Sandbox Code Playgroud)
或者(继续事实#3)一个属于该类的属性,如下所示:
[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
Run Code Online (Sandbox Code Playgroud)
现在,我能做些什么来实现它?
如果您使用BinaryFormatter,它将用于您班级的私人部分.
用[Serializable]标记你的每一堂课,否则你不会走得太远......
另外,看看这个:为什么序列化属性需要序列化属性
既然你需要XML,也许你可以尽情享受SoapFormatter.看到
这个.
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;
Run Code Online (Sandbox Code Playgroud)
尝试md使用多种替代方案进行序列化/反序列化...
不知道你是否可以使用DataContract.但有了这个你可以写:
[DataContract]
class Person
{
[DataMember]
public string m_name;
[DataMember]
private int m_age;
}
Run Code Online (Sandbox Code Playgroud)
您可以序列化私有字段和类的DataContract的优点是不需要默认构造函数.
您目前使用的是什么序列化程序?几乎所有人都应该这样做.但公共领域*是一个坏主意.XmlSerializer和JavaScriptSerializer将忽略私有成员.DataContractSerializer和protobuf-net 可以处理私有成员.BinaryFormatter处理字段(公共或私有),但出于多种原因,IMO并不是一个好主意.