指定如何将对象序列化,如果它在列表中

时间:2013-08-05 20:30:40

标签: c# asp.net serialization

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

Class Items
{
   List<Items> SubItems ...

}

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

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

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

3 个答案:

答案 0 :(得分:1)

  

有没有办法可以指定列表应该被表示   作为序列化时的整数列表?

是的。有两个主要选择:

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

OR

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

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

答案 1 :(得分:1)

要指定对象的序列化方式,您需要实现ISerializable并为GetObjectData提供实现

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

}

此MSDN页面上有一个简单示例:

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

答案 2 :(得分:1)

如果您只想节省空间,可以使用DataContractSerializer来实现这一目标。它有preserveObjectReference选项。它不会复制相同的对象而只存储referenceId 详情here