首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# ISerializable问题

C# ISerializable问题
EN

Stack Overflow用户
提问于 2010-03-20 01:07:12
回答 2查看 9.8K关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-20 01:09:14

除非使用Serializable属性标记类,否则此接口必须由具有序列化实例的所有类实现。如果希望您的类控制自己的序列化和反序列化,请使用ISerializable接口。

GetObjectData()允许您控制序列化过程。

GetDataObject,向其传递一个SerializationInfo对象和一个StreamingContext对象。然后,GetDataObject方法将用目标对象序列化所需的数据填充SerializationInfo对象。

示例:

代码语言:javascript
复制
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。如果您将其保留为空,您的对象将不会具有所需的值。

票数 9
EN

Stack Overflow用户

发布于 2010-03-20 01:28:36

有两种方法可以让你的类型在.Net中实现二进制序列化。

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

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

根据您的场景,除非您有使用ISerializable的非常具体的原因,否则我将采用Serializable属性路线。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2479158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档