c# - 在哪里最好存储临时反序列化数据?

标签 c# serialization deserialization binaryformatter

我能否避免向类中添加额外的字段来存储仅在反序列化/序列化时需要的数据?

假设我有一些类(class):

[Serializable]
class MyClass {
      [NonSerialized]
      NonSerializableDataType myField;

      SomeOtherDataType serializableTemporaryData;

      [OnSerializing]
      OnSerializing (StreamingContext context) {
          // build serializableTemporaryData from myField
      }

      [OnDeserialized]
      void OnDeserialized (StreamingContext context) {
         // build myField from serializableTemporaryData
      }
}

有什么方法可以避免 MyClass 的每个对象中都有 serializableTemporaryData 字段吗?例如,我可以将其设为静态(可能通过更改我的 On... 方法)吗?

约束:我无法更改 NonSerializableDataType 的实现。

示例:假设 myField 包含资源句柄。然后,在序列化时,我必须存储一些关于反序列化后如何获取资源的信息,但我不能存储句柄本身。如果我将句柄包装到另一个类中,那么我只是将问题转移到包装类中——然后我会为包装类问同样的问题。

最佳答案

如果你需要控制序列化过程,你应该实现ISerialization接口(interface)。

[Serializable]
public class MyClass: ISerializable
{
    // As you are in control of serialization process now
    // [Serialized] and [NonSerialized] attributes are no longer required
    private NonSerializableDataType myField;

    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        // Create and populate your SomeOtherDataType local variable here, then push it into info variable
        // Or even better, dont create SomeOtherDataType, just put additional serialization data into info variable, for example:
        info.AddValue("URL", "http://this.way.com");
    }

    protected MyClass(SerializationInfo info, StreamingContext context)
    {
        // Dont forget to define constructor for deserialization purpose

        this.myField = new NonSerializableDataType(loadFromURL: (string)info.GetValue("URL", typeof(string)));
    }
}

没有仅用于序列化数据的额外类,没有字段污染。唯一的潜在问题是监视从此类派生的任何可序列化数据(如果需要,覆盖 GetObjectData(...))。

更多信息:MSDN ISerializable

关于c# - 在哪里最好存储临时反序列化数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329872/

相关文章:

python - 如何在不复制底层数据的情况下序列化多个 numpy View (即具有共享数据的数组)?

deserialization - protobuf-net 的大文件反序列化

c# - 在 wpf 网络浏览器中捕获和取消新窗口打开事件

c# - JSON.Net 自定义合约序列化和集合

C# 对象到 XML

c# - 使用 C# 反序列化 JSON

java - 找不到非具体 Map 类型的反序列化器 [map type;类 javax.ws.rs.core.MultivaluedMap

c# - 映射的网络驱动器,File.Exists 奇怪的行为

c# - 如何获取 datetimepicker c# winform 选中/未选中事件

C#比较操作的奇怪结果