2017-05-09 12 views
2

私は現在、クラスアップデータを作成しようとしています。c# - 変数/プロパティの同じセットを含む異なるクラスを比較する

整数含まれ、シリアライズにClassAがある - 、そして例えば -variable 文字列。 ClassAオブジェクトにキャストされ、シリアライズされ、バイナリファイルに保存されます。 ClassAに、の整数 - との文字列の2つを含むように変更するプログラムアップデートがあります。旧ClassAは、ClassA_0に改名されました。 データがバイナリファイルから戻されるとき、逆並列化されたオブジェクトが、アップデーターメソッドに引数として渡されます。

問題がある:どのように私はそれがとして保存されていた「バージョン」をdertermineすることオブジェクトにClassA_0にClassAを比較するのですか?

編集:

[Serializable] 
public class ClassA 
{ 
    int VarA; 
    int VarB; 
    string VarC; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

[Serializable] 
public class ClassA_0 
{ 
    int VarA; 
    string VarB; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

これらはダミーのクラスなので、私は、コンストラクタやメソッド内のコードが指定されていませんでした。

+1

あなたは、あらかじめデシリアライズするタイプを知る必要があります。ですから、 'オブジェクト 'に逆直列化することはできませんし、実際にどのような型であるのか試してみてください。 – CodeCaster

+0

ClassAとClassA_Oのクラス構造を投稿することができます – Alex

+0

"シリアライズ" - シリアライズ方法?これは 'BinaryFormatter'ですか?もしそうなら...私はそうではありません - シリアル化のアプローチを変更する柔軟性はありますか? –

答えて

1

これが私だったら、私はprotobuf-netのようなツールを見ました。無料など)を使用すると、これらのことをより詳細に制御できます。 - これは、私たちは、後で参照用データとバージョンをシリアライズすることを保証します(あなたがいることをしたいだけなのでgetを持ち、値を無視タグ1ダミー性質があること

[ProtoContract] 
public class ClassA 
{ 
    [ProtoMember(1) 
    int Version { get { return 1; } set {} } 

    [ProtoMember(2)] 
    int VarA; 
    [ProtoMember(3)] 
    int VarB; 
    [ProtoMember(4)] 
    string VarC; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

[ProtoContract] 
public class ClassA_0 
{ 
    [ProtoMember(1) 
    int Version { get { return 2; } set {} } 

    [ProtoMember(2)] // this is the same - compatible, keep tag 
    int VarA; 
    [ProtoMember(5)] // not the same: new tag 
    string VarB; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

注:私はその後のような何かをするだろう)。私たちもバージョンについてのエラーをスローするsetを追加することができますが、私は可能な限り互換性があるようにしたいと思います。

VarAが存在し、両方で互換性があります。タグ2を使用できます。他のデータは互換性がないため、新しいタグが使用されます(5)。必要に応じてSerializer.Deserialize<ClassA>(...)またはSerializer.NonGeneric相当のデータを使用してデータを逆シリアル化する必要があります。しかし、我々はまた、単にバージョンを確認したい場合があります - 私たちはそれを行うことができます。

[ProtoContract] 
public class VersionInfo { 
    [ProtoMember(1)] 
    public int Version {get;set;} 
} 

今私たちは、同じデータにSerializer.Deserialize<VersionInfo>を使用することができ、それだけでバージョンタグをデシリアライズし、他のすべてを破棄します。バージョンを知ったら、ブランチするなどできます。これはでもの相続の形で行われるかもしれませんが、ここでは過度のようです。

+0

これは実際に大きな時間を助けることができます。私は今日後でそれを試してみるだろうし、その後はここに戻ってくる。 –

+0

魅力的な作品です。助けてくれてありがとう! –

0

BinaryFormatterバイナリストリームの仕様はhereです。あなたはストリームを直接読むことができます(デシリアライザを使用しないでください)。それからタイプを特定してください

関連する問題