使用Flags属性序列化枚举值时出现异常

时间:2011-02-02 05:28:31

标签: protobuf-net

使用protobuf-net序列化System.Web.SessionState.SessionStateItemCollection是否可行?尝试序列化时发生以下异常:

  

只能处理数据协定类(以及此类的列表/数组)(错误处理SessionStateItemCollection)

我需要做什么来序列化这个?

1 个答案:

答案 0 :(得分:1)

我不认为这与[Flags]有任何关系,除非你看到别的东西......

protobuf-net按照google定义的protobuf规范序列化对象,这是一种便携式格式,要求接收者事先知道特定数据的布局 - 我的意思是(与BinaryFormatter不同)包含任何说法“此对象是来自MyCorp.Something.Customer的{​​{1}}”。这个“不存储对象”的方法对json(MyCorp.Something.dll),xml(JavaScriptSerializer),XmlSerializer等也很常见。 / p>

那么为什么这很重要?这很重要,因为会话状态存储了无法预测的任意对象。实际上,无法保证(特别是如果状态始终存储在内存中),对象甚至可以远程任何方案下进行序列化。

但这取决于你的目标是什么;如果您想实现会话状态提供程序,那么这应该是可能的 - 但您只需要在提供程序中包含这些额外的元数据,就像我在编写cache provider时所做的那样。所以它会是:

  • 序列:
    • 以某种方式编码DataContractSerializer元数据
    • 使用GetType()对对象进行编码(假设它可以通过protobuf-net序列化)
  • 反序列化
    • 解码类型元数据并解析您的Serialzier.NonGeneric
    • 使用Type解码对象

另一种替代方法是简单地使用在内部处理类型元数据的Serializer.NonGeneric ,但为特殊类型挂钩BinaryFormatter并将其转发到protobuf-net。这允许您的对象与非protobuf-net兼容的对象并排处理,但可以获得对象的增强序列化。代理ISerializable的简短示例就是:

ISerializable