我计划使用序列化来进行克隆。我必须使我的类成为ISerializable。但是它的超类和所有引用的变量类呢?我需要将它们都设为ISerializable吗?
如果我使用ISerializable。我必须实现GetObjectData(),我应该在这个方法中放什么?把它留空好吗?
发布于 2010-03-20 01:09:14
除非使用Serializable属性标记类,否则此接口必须由具有序列化实例的所有类实现。如果希望您的类控制自己的序列化和反序列化,请使用ISerializable接口。
GetObjectData()允许您控制序列化过程。
GetDataObject,向其传递一个SerializationInfo对象和一个StreamingContext对象。然后,GetDataObject方法将用目标对象序列化所需的数据填充SerializationInfo对象。
示例:
public Employee(SerializationInfo info, StreamingContext ctxt)
{
//Get the values from info and assign them to the appropriate properties
EmpId = (int)info.GetValue("EmployeeId", typeof(int));
EmpName = (String)info.GetValue("EmployeeName", typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
//You can use any custom name for your name-value pair. But make sure you
// read the values with the same name. For ex:- If you write EmpId as "EmployeeId"
// then you should read the same with "EmployeeId"
info.AddValue("EmployeeId", EmpId);
info.AddValue("EmployeeName", EmpName);
}上面的例子展示了如何反序列化和序列化。如您所见,反序列化需要GetObjectData。如果您将其保留为空,您的对象将不会具有所需的值。
发布于 2010-03-20 01:28:36
有两种方法可以让你的类型在.Net中实现二进制序列化。
最简单、最容易的方法是使用Serializable属性标记您的类型、层次结构中所有关联的类型以及这些类型中所有字段的所有类型。这看起来似乎很多,但对于小的对象层次结构来说,它不可能相对快速地完成。不过,这种方法的好处在于,您实际上不必为序列化做任何其他工作。您只需将类型声明为可序列化的,然后由CLR完成其余的工作。
另一种方法是在层次结构中的所有类型上实现ISerializable。但这样做只是声明您的类型是可序列化的。实际上,您必须在ISerializable上实现这些方法才能手动序列化这些值。一般来说,这种方法的工作量要大得多,而且增加了维护成本,因为在类型中添加或删除字段时,您必须不断更新它。但是,如果您不能控制层次结构中的所有类型,那么它可能是必要的
根据您的场景,除非您有使用ISerializable的非常具体的原因,否则我将采用Serializable属性路线。
https://stackoverflow.com/questions/2479158
复制相似问题