2012-02-20 2 views
0

は、私がアプリケーションのバージョン1.0を持っているクラスのよう:XMLSerialization - backwardscompatibility

class MyBaseDTO 
{ 
    [XmlElementAttribute(DataType="base64Binary", IsNullable=true, ElementName="Data")] 
    public byte[] Data{get;set} 
} 

class MySubDTO 
{ 
    [XmlElementAttribute(DataType="base64Binary", IsNullable=true, ElementName="MoreData")] 
    public byte[] MoreData{get;set} 
} 

は今、バージョン1.1で、私はMySubDTO.MoreDataを移動したいサブクラスMyBaseDTOへ。私は

class MyBaseDTO 
{ 
    [XmlElementAttribute(DataType="base64Binary", IsNullable=true, ElementName="Data")] 
    public byte[] Data(){get;set} 
    [XmlElementAttribute(DataType="base64Binary", IsNullable=true, ElementName="MoreData", NameSpace="MyBaseDTO")] 
    public byte[] MoreData(){get;set} 
} 
それはもちろん作品

が、私を追加する場合

<a:MyBaseDTO i:type="b:MySubDTO"><a:Data>...</a:Data><b:MoreData>...</b:MoreData></a:MyBaseDTO> 

: 問題は、私は1.1クライアントと1.0サーバーと通信する場合、XMLがどのように見えるのでMOREDATAはserialzedされることはありませんということですMoreDataが2つの異なる名前空間を持つ可能性があることを理解できるようにしたいと考えています。 WCFを使用してWebサービス間で通信し、DataContractSerializerを使用してサーバー側のオブジェクトをシリアル化しています。これは達成できますか?

答えて

0

あなたは、いくつかのオプションがあります。

  • 私は、これはIExtensibleDataObject(拡張データ)のために設計されたシナリオのようなものだと思います!データ契約のv1が拡張データインターフェイスで装飾されている場合、未来の未知の種類を含む将来のデータ契約の改訂版からのデータを自動的に無視し、保存し、往復することになります。

特定の型に対してラウンドトリップを有効にするには、型がIExtensibleDataObjectインターフェイスである必要があります。このインターフェイスには、ExtensionData(ExtensionDataObject型を返す)という1つのプロパティが含まれています。このプロパティは、未知のデータコントラクトの将来のバージョンのデータを現在のバージョンに保存します。ここで私が何を意味するかの例です:

[DataContract] 
public class Person : IExtensibleDataObject 
{ 
    [DataMember] 
    public string fullName; 
    private ExtensionDataObject theData; 

    public virtual ExtensionDataObject ExtensionData 
    { 
     get { return theData; } 
     set { theData = value; } 
    } 
} 

WCFインフラストラクチャは、元のデータコントラクトの一部ではないデータを検出すると、このプロパティにデータを保存し、保存します。一時的な保管以外の方法では処理されません。オブジェクトが元の場所に戻された場合、元の(未知の)データも戻されます。

DataContractSerializerコンストラクタでignoreExtensionDataObjectをtrueに設定するか、ServiceBehaviorAttributeでIgnoreExtensionDataObjectプロパティをtrueに設定することで、このラウンドトリップ機能をいつでもオフにできます。それはパフォーマンスヒットを持っているので、あなたがそれを必要としなければ、私はそれをオフにします。

  • 上記のガイダンスでは、DataContractSerializerに切り替える必要があります。このタイプではできない場合は、IDataContractSurrogateを使用してこのXMLタイプを、まさに自分が行っているように見えるDataContractタイプに変換する必要があります。また、タイプごとまたはオブジェクトごとにカスタムJSONシリアライズおよびデシリアライズを行うこともできます。
関連する問題