【问题标题】:Custom .NET Serialization doesn't seem to work自定义 .NET 序列化似乎不起作用
【发布时间】:2009-07-08 12:36:56
【问题描述】:

我正在使用BinaryFormatter 序列化存储在System::Collections::Generic::List<A^>^ 中的A 类对象的集合。我添加了[Serializable] 标签并在A 类中实现了ISerializableGetObjectData 和特殊构造函数)。反序列化时,我发现列表已反序列化,并且包含与序列化相同数量的元素。但是,这些元素中的每一个都是空引用。

我检查了抛出的异常,并确定不是这种情况。我已经检查以确保在反序列化过程中,A(SerializationInfo ^info, StreamingContext context) 形式的特殊构造函数被调用了正确的次数,但是这些重新构造的对象没有从反序列化的集合中被引用。

我还用array<A^>^ 替换了System::Collections::Generic::List<A^>^,我仍然得到相同的结果。该数组具有正确数量的元素,但每个元素都是空引用。

有人遇到过类似问题吗?有什么线索吗?

【问题讨论】:

  • 破解代码示例对于这类问题总是很方便
  • 在您的 GetObjectData 方法中,您是否在列表中调用 ToArray()?过去,当我试图过度思考序列化过程并得到同样的行为时,我曾犯过这个错误。
  • Kleinux,我没有调用 ToArray(),但我确实尝试过一次,看看它是否会起作用。没有这样的运气。
  • @Sam,源代码是专有的,我不能在这里发布。我试图重新创建行为样本,但所有样本都完美运行!我想知道默认的序列化行为是否已在程序早期的某个地方以某种方式修改/覆盖。

标签: .net serialization


【解决方案1】:

问题在于子对象中引用的任何对象都不需要在调用GetValue 后立即完全反序列化。在我的例子中,通用 List 尚未完全反序列化,因此仅包含空引用。在对象图完全反序列化后,我终于使用IDeserializationCallback 执行代码。

【讨论】:

    【解决方案2】:

    从您的描述看来,您列表中的项目可能是不可序列化的;如果您可以控制该类,您能否验证它是否也被标记为可序列化?

    另外,您是否尝试过使用 XmlFormatter 来直观地检查序列化数据以了解其构建方式?它可能会提供一些关于问题是在序列化还是反序列化期间发生的见解。

    【讨论】:

    • 我确实可以控制我要序列化的类。它被标记为 [Serializable] 并且还实现了 ISerializable 以处理它引用的一些单例。
    • 我尝试了 SoapFormatter(找不到 XmlFormatter 类...假设您的意思是肥皂),我明白了:Soap Serializer does not support serializing Generic Types
    • 呃,是的...把我的名字弄混了——我想的是 System.Xml.Serialization 下的 XmlSerializer,而不是 XmlFormatter
    猜你喜欢
    • 2022-01-08
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多