指定如何序列化列表中的对象

本文关键字:对象 列表 序列化 | 更新日期: 2023-09-27 18:26:35

我有一个有点复杂的class,它可能包含也可能不包含相同类型的项目列表

Class Items
{
   List<Items> SubItems ...
}

类本身是可序列化的,但是序列化列表中的对象将是一种巨大的空间浪费,因为它们是在被包括在列表中之前序列化并添加到数据库中的。

有没有一种方法可以指定列表在序列化时应该表示为整数列表?

注意:这些整数将表示序列化对象所在行的主键。

指定如何序列化列表中的对象

有没有一种方法可以让我指定列表应该被表示序列化时作为整数列表?

是的。有两个主要选项:

1)实现ISerializable接口,您可以在其中控制对象的序列化/反序列化方式。

2)将您的列表声明为[NonSerialized],并管理包含主键的私有成员列表。不过,您必须自己实现加载/存储Integer List的逻辑。

如果要序列化的类很大,我建议您使用第二种方法,因为在另一种情况下,您必须手动序列化/反序列化每个属性。

要指定对象的串行化方式,需要实现ISerializable并提供GetObjectData 的实现

public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
{
}

这个MSDN页面上有一个简单的例子:

http://msdn.microsoft.com/en-us/library/ms973893.aspx

如果您只想节省空间,可以使用DataContractSerializer来实现这一点。它具有preserveObjectReference选项。它不重复相同的对象,而是只存储referenceId
此处详细介绍