C#ISerializable问题

C#ISerializable问题,c#,C#,我计划使用序列化来进行克隆。我必须使我的类可以序列化。但是它的超类和所有引用的变量类呢?我需要使它们都可以进行ISerializable吗 如果我使用ISerializable。我必须实现GetObjectData(),我应该在该方法中放入什么?让它空着行吗 除非你在课堂上用 [Serializable]属性,此 接口必须由所有用户实现 具有序列化实例的类。使用 ISerializable接口,如果 希望您的类控制自己的 序列化和反序列化 GetObjectData()允许您控制序列化过程 Ge

我计划使用序列化来进行克隆。我必须使我的类可以序列化。但是它的超类和所有引用的变量类呢?我需要使它们都可以进行ISerializable吗

如果我使用ISerializable。我必须实现GetObjectData(),我应该在该方法中放入什么?让它空着行吗

除非你在课堂上用 [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。如果将其留空,对象将不会具有所需的值。

有两种方法可以使类型在.Net中可二进制序列化

最简单、最简单的方法是使用
Serializable
属性标记您的类型、层次结构中所有与其关联的类型以及这些类型中所有字段的所有类型。这似乎很多,但对于小对象层次结构来说,这不能相对快速地完成。不过,这种方法的优点在于,您实际上不必为序列化做任何其他工作。您只需将类型声明为可序列化的,CLR将完成其余工作

另一种方法是在层次结构中的所有类型上实现
ISerializable
。但这只是将您的类型声明为可序列化的。实际上,您必须在
ISerializable
上实现这些方法来手动序列化这些值。一般来说,这种方法需要做更多的工作,并且增加了维护成本,因为在添加字段或从类型中删除字段时,您必须不断更新它。但是,如果您不能控制层次结构中的所有类型,那么这是必要的


根据您的场景,我将选择
Serializable
属性路径,除非您有使用
ISerializable

的非常具体的原因,否则我尝试使用此方法进行克隆:。如果我需要定义所有GetObjectData方法,那么最好定义我自己的克隆方法。这样,对象将可序列化。使用Clone()方法,就像在您发送给我的链接中一样,您应该在业务中:)您的blockquote使用“GetDataObject”,而您的代码和其他文本使用“GetObjectData”。这是两个独立的方法,还是这只是一个输入错误?如果我有一个ArrayList成员,如果我使用可序列化的方法,默认情况下它会被深度复制?序列化需要
GetObjectData
。反序列化需要构造函数。