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类大得多,有许多变量我想保留私有集方法,这些方法可能有验证代码。