繁体   English   中英

C#ISerializable问题

[英]C# ISerializable question

我打算用序列化做克隆。 我必须让我的课程ISerializable。 但是它的超级类和所有引用的变量类呢? 我需要将它们全部变为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的非常具体的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM