我正在尝试找到最佳实践或一些可接受的设计模式,用于序列化那些不是为序列化而构建的类。以下是我目前实施的方法:
例如,考虑一些我想要构造函数的简单类:
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类执行任何序列化操作。
对这种方法有什么批评?是否有更好的,既定的模式?
对不起,如果我的问题很糟糕,我是一个新学员!
答案 0 :(得分:0)
正如Jeroen van Langen所指出的那样,如果你想完全控制序列化的发生方式,那么ISerializable是你需要实现的,但是如果你需要对很多类进行这样的操作,那么更是如此。
我个人通常会倾向于你的第二个例子,但如果我可以通过Coord而不是因为它们似乎是'数据,那么我不会尝试将数据项类作为传输类。在这种情况下。使coords公开并可序列化而不是数据项。
答案 1 :(得分:0)
所以似乎有其他类可以序列化为XML而没有XmlSerializer强加的这些限制 - 即DataContractSerializer。使用它代替XmlSerializer并使用[DataContract]和[Datamember]分别标记我的类和私有属性非常有用。
我被告知这种方法存在一些限制,但就我而言,它是一种更简洁的解决方案。
谢谢!