C#序列化私有类成员

时间:2010-11-30 14:48:33

标签: c# serialization

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?
}

现在,我该怎么做才能实现它?

7 个答案:

答案 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)

答案 5 :(得分:0)

答案 6 :(得分:0)

使用IXmlSerializable界面和要序列化的控制字段:

public interface IXmlSerializable
{
    XmlSchema GetSchema();
    void ReadXml(XmlReader reader);
    void WriteXml(XmlWriter writer);
}