2012-02-04 13 views
0

同じ基本インターフェイスを継承するいくつかのインターフェイスを実装するクラスに対してシリアル化したいと思います。現在私はBinaryFormatterを使用していますが、proto-buf .NETを使いたいです。しかし、私は現在、私はこのような問題点と同様の問題に直面するだろうと思う:私は現在、考える how to serialize a class implements two interfaces who have same based interfaceProto-buf .NET複雑な継承インターフェイスのシリアル化

唯一の可能な解決策は、私は私の複雑なクラスを作成するために使用するシンプルなデータクラスをシリアライズ私のクラスのラッパーになります。

私が引用した例では、私はこのような構造を持っているように、さらにそれを説明してみましょう:私は、これは原始bufには現在可能ではないと思ったよう

public interface IProduct 
{ 
    string SomeMethod(); 
} 

public interface ISimpleProduct : IProduct 
{ 
    int SomeProperty { get; } 
} 

public interface IConstructionProduct : IProduct 
{ 
    int AnotherProperty {get; 
} 

public class ConcreteProduct : ISimpleProduct , IConstructionProduct 
{ 
    int SomeProperty {get; set;} 
    int AnotherProperty {get; set;} 

    string SomeMethod() 
    { 
      return "A concrete Product"; 
    } 
} 

は、今私は、ConcreteProductをシリアル化したいです.NET私はこのような、ラッパーのデータクラスを持って検討していた。

public class ProductData 
{ 
    int[] PropertyValues { get; set;} 
} 

とIProductInterfaceにそれぞれ具体的な製品を構築するためのメソッドを追加するために、

のような

もちろん、ProductDataは現実のほうが洗練されていますが、コンセプトのためだけです。 ProductDataを今すぐシリアル化します。私は、Product ConcreteProductクラスのインターフェース設定を変更したくないのです。後でこれらのインターフェースが必要になるからです。このアプローチについて私が気に入っているのは、拡張機能の問題はBuildProductの実装で扱うことができるということです。 もう一度、私は初心者です、何かがただのナンセンスなら、それを残念と私を修正してください。

@ Marc、私はあなたがその物のためにたくさんのことを書いていることを知っていますが、DataTableのような他の投稿(私はまだproto-bufを使っていません)私のために多くの時間。

+1

シリアル化したいモデルの種類の例を挙げることができますか?私は正確な答えを与えることができますか? (著者、protobuf-net) –

答えて

1

union typesのアプローチのようです。すべての製品に適したシリアライズフォーマットを1つ作成したいとします。さらに、各製品をそのユニオンタイプにマップしてマップバックする必要があります。

残っているので、マッピングの仕方が気になります。正直言って、IProductインターフェースのこれらの2つの方法では、長期的にはうれしくないと思います。デシリアライゼーションの問題に対処する必要があることを認識していることを願っています。どのタイプを実際にインスタンス化しますか?あなたのコードでは、新しいConcreteProduct()、BuildProduct(データ)を呼び出して、ConcreteProductを取得する必要があります。そして、問題は、インスタンス化する必要があるConcreteProductであることをどのように知っていますか? BuildProductを呼び出すコードでは、これを知る必要があります。これらの方法を削減し、マッピング作業のための別のインフラストラクチャを作成することができます。ここFactory Methodパターンは、この種の問題のためにどのように見えるかです:あなたが見

public interface IProductMapper { 
    IProduct Unmap(ProductData data); 
    ProductData Map(IProduct product); 
} 

public static class ProductMapperFactory { 
    public static IProductMapper GetMapper(ProductData data) { 
    if (data.Type == "ConcreteProduct") return new ConcreteProductMapper(); 
    else if ... 
    } 

    public static IProductMapper GetMapper(IProduct product) { 
    if (product is ConcreteProduct) return new ConcreteProductMapper(); 
    else if ... 
    } 
} 

public class ConcreteProductMapper : IProductMapper { 
    public IProduct Unmap(ProductData data) { 
    var product = new ConcreteProduct(); 
    // map properties 
    return product; 
    } 

    public ProductData Map(IProduct data) { 
    var data = new ProductData(); 
    // map data 
    return data; 
    } 
} 

、決定的なラインはdata.Type == "ConcreteProduct"です:どういうわけか、あなたは、製品のどのようなものを知っているために、データ内の製品の種類を指定する必要があります。共用体型から戻ってマッピングするときにインスタンス化する。

私が一般的に見ているユニオンタイプのもう一つの難しさは、オブジェクトグラフのde/serializationです。独自のシリアライゼーションタイプがあるので、オブジェクトグラフを作成/作成するための独自のコードを記述する必要があります。あなたが言うように初心者であれば、おそらくあなたを傷つける世界(または、 - あなたが好きなら学習の世界)に置くでしょう:-p)。

いずれにしても、実際にインターフェイスを設定してシリアル化する必要がありますか?代わりに他のすべての製品が派生し、必要なインクルードを持つProduct基本クラスから始まるクラス階層を作成することは可能でしょうか。私はこれが(少なくともprotobufで)問題を少なくするだろうと思う。

最後に、マスターの質問:なぜBinaryFormatterからprotobufに正確に切り替える必要がありますか?

関連する問題