使用构造函数从类中序列化数据

时间:2016-06-01 10:39:32

标签: 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 = 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类执行任何序列化操作。

对这种方法有什么批评?是否有更好的,既定的模式?

对不起,如果我的问题很糟糕,我是一个新学员!

2 个答案:

答案 0 :(得分:0)

正如Jeroen van Langen所指出的那样,如果你想完全控制序列化的发生方式,那么ISerializable是你需要实现的,但是如果你需要对很多类进行这样的操作,那么更是如此。

我个人通常会倾向于你的第二个例子,但如果我可以通过Coord而不是因为它们似乎是'数据,那么我不会尝试将数据项类作为传输类。在这种情况下。使coords公开并可序列化而不是数据项。

答案 1 :(得分:0)

所以似乎有其他类可以序列化为XML而没有XmlSerializer强加的这些限制 - 即DataContractSerializer。使用它代替XmlSerializer并使用[DataContract]和[Datamember]分别标记我的类和私有属性非常有用。

我被告知这种方法存在一些限制,但就我而言,它是一种更简洁的解决方案。

谢谢!