C#ISerializable问题

时间:2010-03-19 17:07:12

标签: c#

我打算使用序列化进行克隆。我必须让我的课程ISerializable。但是它的超级类和所有引用的变量类呢?我需要将它们全部变为ISerializable吗?

如果我使用ISerializable。我必须实现GetObjectData(),我应该放在该方法中?把它留空可以吗?

2 个答案:

答案 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的特定原因。