首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现版本控制的ISerializable

实现版本控制的ISerializable
EN

Stack Overflow用户
提问于 2014-11-11 08:08:41
回答 2查看 190关注 0票数 3

考虑以下POD类类型:

代码语言:javascript
复制
public class Price { public decimal OfferPrice { get; set; } }

对象是从服务器中检索出来的,所以让我们用可序列化的方法来修饰它。

代码语言:javascript
复制
[Serializable]
public class Price { public decimal OfferPrice { get; set; } }

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

现在,类已经用BonusPrice进行了扩展。

代码语言:javascript
复制
[Serializable]
public class Price { 
  public decimal OfferPrice { get; set; } 
  public decimal BonusPrice { get; set; } 
}

新程序集部署到服务器,部署到一个客户端,而不是另一个客户端。因此,当(反序列化Price对象)时,旧版本的客户端将崩溃。

旧版本的客户端不需要BonusPrice字段,所以在版本不同时继续工作是很好的。因此,我正在考虑从一开始就实现ISerializable,因此第一个和第二个版本如下所示:

代码语言:javascript
复制
// 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是一个很好的版本控制方法吗?这些问题通常是如何解决的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-11 08:18:26

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

OptionalFieldAttribute具有VersionAdded属性。在.NET框架的2.0版本中,这是不使用的。但是,正确设置此属性非常重要,以确保该类型将与未来的序列化引擎兼容。 该属性指示已添加给定字段的类型的哪个版本。每次修改类型时,它都应该增加一个(从2开始)。

还有其他方法,如序列化回调、SerializationBinder、ISerializable等。

有关更多信息,请参考版本容忍度序列化

票数 2
EN

Stack Overflow用户

发布于 2014-11-11 08:24:02

从我的观点来看,您正在尝试将两个协议版本混合在一个契约中。在您的示例中,它可以工作,但在实践中,通常很难统一新协议,所以最好将它们分开。换句话说,您的服务器必须独立支持这两个版本。看看OData协议版本化

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26860297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档