C#序列化私有类成员

Pon*_*oni 35 c# serialization

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)

现在,我能做些什么来实现它?

Bra*_*tie 17

假设输入错误,我想将您重定向到这篇SO文章,其中解决方案是使用DataContractSerializer.


Dan*_*dor 8

如果您使用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使用多种替代方案进行序列化/反序列化...

  • "它会用于你班级的私人部分." - 哎呀,这听起来很痛苦.:) (9认同)
  • @Daniel - 并非所有婚姻都结束.我非常**不是BF的粉丝 (2认同)
  • @Daniel - 我会尝试使用二进制文件,但目前规范要求序列化为XML格式,可能是因为它进入了一个人类也应该读取的数据库.把它放在一边,我不能不告诉你我希望SO的每个成员,实际上在每个社区都能拥有你所拥有的良好态度 - 坚持下去,你正在前往100K的代表.(: (2认同)

Oli*_*ver 7

不知道你是否可以使用DataContract.但有了这个你可以写:

[DataContract]
class Person
{
    [DataMember]
    public string m_name;

    [DataMember]
    private int m_age;
}
Run Code Online (Sandbox Code Playgroud)

您可以序列化私有字段和类的DataContract的优点是不需要默认构造函数.


Mar*_*ell 5

您目前使用的是什么序列化程序?几乎所有人都应该这样做.但公共领域*一个坏主意.XmlSerializer和JavaScriptSerializer将忽略私有成员.DataContractSerializer和protobuf-net 可以处理私有成员.BinaryFormatter处理字段(公共或私有),但出于多种原因,IMO并不是一个好主意.