C# 使用构造函数序列化类中的数据

C# 使用构造函数序列化类中的数据,c#,serialization,xml-serialization,C#,Serialization,Xml Serialization,我试图找到最佳实践或一些可接受的设计模式,用于序列化不是为序列化而构建的类。以下是我目前实施的方法: 例如,考虑一些简单的类,在这里我想要一个构造函数: public class Coord { public int x { get; private set;} public int y { get; private set;} public Coord(int x, int y) { this.x = x; this.y =

我试图找到最佳实践或一些可接受的设计模式,用于序列化不是为序列化而构建的类。以下是我目前实施的方法:

例如,考虑一些简单的类,在这里我想要一个构造函数:

public class Coord
{

    public int x { get; private set;}
    public int y { get; private set;}

    public Coord(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

}
如果我想序列化它,我必须将字段公开为完全公共的,并提供一个无参数构造函数

创建其他类只是为了保存我想要序列化的值是否可以接受:

public class DataItem
{
    public int x;
    public int y;
}
然后可能有在这些类之间构建和加载的方法

public static DataItem saveCoord (Coord c)
    {
        DataItem result = new DataItem ();
        result.x = c.x;
        result.y = c.y;

        return result;
    }

public static Coord loadCoord (DataItem di)
    {
        Coord result = new Coord (di.x, di.y);
        return result;
    }
然后我可以对我的DataItem类执行任何序列化操作

对这种方法有哪些批评?是否有更好的既定模式


对不起,如果我的问题不好,我是一个新的学习者

正如Jeroen van Langen所指出的,如果您想完全控制序列化的发生方式,则需要实现ISerializable,但这可能是一项非常重要的任务,如果您需要对许多类执行此操作,则更需要实现ISerializable


我个人通常倾向于第二个示例,但如果我可以传递Coord,我不会尝试将数据项类设置为传输类,因为在这种情况下,它们似乎是“数据”。使coords公开并可序列化,而不是数据项。

因此,似乎还有其他类可以序列化为XML,而不受XmlSerializer施加的这些限制,即DataContractSerializer。用它代替XmlSerializer,并分别用[DataContract]和[Datamember]标记我的类和私有属性,效果非常好

我被告知这种方法有一些限制,但在我的情况下,这是一个更简洁的解决方案


谢谢

您应该看看
ISerializable
接口,谢谢Jeroen,它看起来是一个非常有用的接口。我编辑了我的代码来完善我的问题,也许这个解决方案在我的情况下更简单。没有通用的解决方案。某些序列化程序(
DataContractSerializer
e.g.)支持代理序列化类型。看
XmlSerializer
没有,但您可以在包含类型上添加代理属性,请参阅。或者,您可以在
坐标上键入。请注意,
XmlSerialize
不支持
ISerializable
。非常感谢。对于一个刚刚突破主题的人来说,iSerializeble看起来确实很难。我想我得慢慢来。我在这里使用这个中间DataItem类的理由是,实际上,我想要序列化的类比这个Coord类大得多,有许多变量我想保留私有集方法,这些方法可能有验证代码。