我打算使用序列化进行克隆。我必须让我的课程ISerializable。但是它的超级类和所有引用的变量类呢?我需要将它们全部变为ISerializable吗?
如果我使用ISerializable。我必须实现GetObjectData(),我应该放在该方法中?把它留空可以吗?
答案 0 :(得分:9)
除非你用 [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。如果将其留空,则您的对象将没有所需的值。
答案 1 :(得分:3)
有两种方法可以在.Net中使您的类型二进制序列化。
最简单,最简单的方法是标记您的类型,层次结构中所有类型的关联类型以及具有Serializable
属性的所有类型的所有字段。这似乎很多,但对于小对象层次结构,它不能相对快速地完成。虽然这种方法的好处在于你实际上不需要为序列化做任何其他工作。您只需将类型声明为可序列化,CLR即可完成其余工作。
另一种方法是在层次结构中的所有类型上实现ISerializable
。但所有这一切都声明您的类型是可序列化的。实际上,您必须在ISerializable
上实现方法以手动序列化值。一般来说,这种方法需要做更多的工作并且增加了维护成本,因为在从类型中添加或删除字段时必须不断更新它。如果您不控制层次结构中的所有类型
根据您的方案,我会使用Serializable
属性路线,除非您有使用ISerializable
的特定原因。