实现用于版本控制的ISerializable

本文关键字:ISerializable 版本控制 用于 实现 | 更新日期: 2023-09-27 18:29:55

考虑以下POD类型的类:

public class Price { public decimal OfferPrice { get; set; } }

这个类中的对象是从服务器中检索的,所以让我们用Serializable 来装饰它

[Serializable]
public class Price { public decimal OfferPrice { get; set; } }

现在有两个客户端在不同的机器上检索这些对象。他们不会发价格。他们都得到了普莱斯集会的副本。

现在,该类使用BonusPrice进行了扩展。

[Serializable]
public class Price { 
  public decimal OfferPrice { get; set; } 
  public decimal BonusPrice { get; set; } 
}

新程序集部署到服务器,部署到其中一个客户端,但不部署到另一个客户端。因此,旧版本的客户端在序列化Price对象时会崩溃。

使用旧版本的客户端不需要BonusPrice字段,所以当存在版本差异时,它继续工作会很好。因此,我考虑从一开始就实现ISerializable,因此第一个和第二个版本看起来像:

// version 1.0
[Serializable]
public class Price : ISerializable {
  protected Price(SerializationInfo info, StreamingContext context) {
    OfferPrice = info.GetDecimal("op");
  }
  [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
  public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
    info.AddValue("op", OfferPrice);
  }
}
// version 2.0
[Serializable]
public class Price : ISerializable {
  protected Price(SerializationInfo info, StreamingContext context) {
    OfferPrice = info.GetDecimal("op");
    BonusPrice = info.GetDecimal("bp");
  }
  [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
  public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
    info.AddValue("op", OfferPrice);
    info.AddValue("bp", BonusPrice);
  }
}

因此,现在,当一个客户端没有更新到版本2时,它仍然只会继续反序列化OfferPrice,而不会崩溃。当它在某个时刻更新时,它将自动使用BonusPrice。

我的问题是:当只读取对象时,实现ISerializable是进行版本控制的好方法吗?这些问题通常是如何解决的?

实现用于版本控制的ISerializable

您可以使用OptionalFieldAttribute来控制BinaryFormatterSoapFormatter的版本控制。

OptionalFieldAttribute具有VersionAdded属性。在.NET Framework的2.0版本中,不使用此选项。但是,正确设置此属性以确保类型与未来的序列化引擎兼容是很重要的。

该属性指示给定字段的类型版本添加。它应该每增加一(从2开始)修改类型的时间

还有其他方式,如SerializationCallbacks、SerializationBinder、ISerializable

有关详细信息,请参阅版本容忍序列化。

从我的角度来看,您正试图在一个合同中混合使用两个协议版本。在您的示例中,它是有效的,但在实践中,通常很难统一新的协议,所以最好将它们分开。换句话说,您的服务器必须独立地支持这两个版本。看看OData协议版本控制