2

我可以避免向类添加额外的字段来存储仅用于反序列化/序列化的数据吗?

假设我有一些课程:

[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
      }
}

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

约束:我无法更改NonSerializableDataType.

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

4

2 回答 2

5

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

[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

于 2012-09-08T12:43:17.240 回答
3

有一个序列化代理的概念可以帮助您克服 . 的困难SomeNonSerializableType,因为它正是为此而设计的。但是,这要求您可以在创建格式化程序时配置序列化代理。否则,您将需要通过实现来自定义序列化过程ISerializable

于 2012-09-08T13:09:57.117 回答