2016-06-24 4 views
0

今、私はシリアライズしてディスクに保存したいいくつかのクラスを持っています(フォーマットは関係ありません)。しかし、私が本当に必要とするのは、それぞれからいくつかの選択フィールドです。これらのフィールドはクラスによって異なりますが、すべて公開されています。私のアプローチ任意のクラスの保存とシリアライズ

public class A { 
    public string stringField; 
    public int intField; 
    ... 
} 

public class B { 
    public float floatField; 
    public Object objectField; 
    ... 
} 

は保存し、これらのフィールドをシリアル化だけでなく、各クラスの保存されたpublicフィールドを持つクラスのインスタンスを返すためにそれらをロードすることができ、簡単なコンテナクラスを持っていることでした。

私は、保存したいクラスのものと一致するフィールドを持つクラスを作ることでこれを行うことができます。

public class AStorage{ 
    public string stringFieldStorage; 
    public int intFieldStorage; 
    ... 

    public void StoreA(A a){ 
     stringFieldStorage = a.stringField; 
     intFieldStorage = a.intField; 
    }  

    public A GetA(){ 
     A a = new A(); 
     a.stringField = stringFieldStorage; 
     a.intField = intFieldStorage; 
     return a; 
    } 
} 

これは動作しますが、それは、私はクラスの多くを必要とし、私は彼らが、彼らが保存しているクラスから受信したいものに応じてフィールドを与える必要がありますを意味します。

私はフィールドと名前をつかむために反射を使用してみましたが、それはずっと簡単です。私はDictonary<string, Object>フィールド名でキーを付けて、次にそれらを参照することができます。しかし、それは私に少し不快感を感じ、私が間違ったことを全部やっているのかどうか疑問に思いました。クラスの保存とシリアライズにはどのような方法がありますか?

答えて

1

たとえば、NotSerializedAttribute(たとえばバイナリシリアライザ)でシリアル化してはならないプロパティをマーキングするか、シリアル化に明示的にオプトインするプロパティを要求するなど、多くのシリアライザはselective serializationをサポートしています。 DataContractSerializerのDataMemberAttribute。

いずれの方法を使用しても、ストレージ用に別のクラスを作成する必要はなく、.NET Frameworkによって完全にサポートされています。

0

私は、反射を使ってフィールドを名前と単純に一致させることに決めました。私がする必要があるのは、ストレージクラスに保存したいフィールドを作成することだけです。私はまた、いずれかの手動割り当てを行う必要はありませんので、私のプロジェクト規模ではかなり持続可能です。ここに2つの方法があります。

public void Store(Object source){ 
    var thisType = this.GetType(); 
    var sourceFields = source.GetType().GetFields (flags); 
    foreach (var field in sourceFields) { //get all properties via reflection 
     var instanceField = thisType.GetField (field.Name); 
     if(instanceField != null){ //check if this instance has the source's property 
      var value = field.GetValue(source); //get the value from the object 
      if(value != null){ 
       instanceField.SetValue(this, value); //put it into this instance 
      } 
     } 
    } 
} 

public T LoadIntoObject<T> (T target){ 
    var targetFields = target.GetType().GetFields(); 
    foreach (var field in targetFields) { 
     var instanceField = this.GetType().GetField (field.Name); 
     if(instanceField != null){ //check if this instance has the targets's property 
      var value = instanceField.GetValue(this); 
      if(value != null){ 
       field.SetValue(target, value); //put it into the target 
      } 
     } 
    } 
    return target; 
} 
+0

シリアル化は、.NET Frameworkによってよく解決される問題です。なぜ独自のソリューションを作成したいのですか? –

関連する問題