2009-03-03 8 views
3

MSDNのシリアル化サンプルについて混乱します。シリアル化でGetObjectDataを呼び出す

マイ混乱(シリアライゼーション中に呼び出される)メソッドGetObjectDataである、方法、

  1. シリアライズ(AddValueからメソッドGetObjectDataで)追加の​​データクラスのフィールド/プロパティの両方があろう。
  2. または、クラスのフィールドやプロパティを記述しないでGetObjectDataメソッドにデータを書き込むだけですか?

私はdebug(2)正しいですか?GetObjectDataメソッドを使用するとフィールド/プロパティのデータはシリアル化されませんか?あれは正しいですか? (私は専門家ではないですし、ちょうどここを確認したいのですが、自分自身について100%の自信を持って。)

答えて

2

あなたがISerializableを実装する場合、あなたはすべてデータ(あなたの質問では、すなわち、シナリオ「2」)のためにreasponsibleあります。特別なものは何も自動的にシリアル化されません。あなたの要件は何ですか? DataContractSerializerのようなものはプロパティベースで、通常のフィールドのカスタムプロパティ(ロジックがある)を飾って、適切にシリアル化することができます。バイナリ(スペースなど)が必要な場合は、おそらくprotobuf-netのようなものを考えてください。

あなたの要件は?

データ契約の例:あなたがISerializableを実装する場合

[DataContract] 
public class Foo { 
    [DataMember] 
    public int Bar {get;set;} // simple data 

    [DataMember] 
    private string DoSomeThinking { 
     get {.... serialize the complex data ....} 
     set {.... deserialize the complex data ....} 
    } 
} 
+0

または上記のバイナリでは、NetDataContractSerializerを使用できます。http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx –

+0

ありがとうMarc! ISerializableインターフェイスv.sの実装の違いは何ですか? [Serializable]属性のマーク? – George2

+1

[Serializable]とマークすると、単に "これをシリアル化することはOKです"と表示されます。ほとんどのシリアライゼーションエンジンはこれを検出し、フィールド(実装)またはプロパティ(コントラクト)を自動的にシリアル化します。 ISerializableは、BinaryFormatterによって**カスタム**シリアライゼーションに使用されます。ここで*バイナリを制御します。 –

2

あなたはAddValueを使用してSerializationInfoに、すべてのフィールドを含むすべてのデータ(デシリアライズするために必要な、少なくともデータ)を追加する必要があります。あなたが達成したいが、C#はあなたのために仕事やらせることが容易でないものを

+0

ISerializableインターフェイスv.sを実装するのと同じですか? [Serializable]属性のマーク? – George2

+1

ISerializableを実装する場合は、クラスに[Serializable]もマークする必要があります。シリアライゼーションに追加情報を追加したくない場合は、クラスがかなりシンプルであるため、ISerializableを実装する必要はありません。 –

+1

あなたがしなければならないことは、[Serializable]でマークすることです。ランタイムはすべての作業を行います。 –

2

イムわからない:

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

namespace Test 
{ 
    [Serializable] 
    public class TestObject 
    { 
     private String name; 
     private String note; 
     #region Getters/setters 

     public String Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     public String Note 
     { 
      get { return note; } 
      set { note = value; } 
     } 
     #endregion 
    } 
} 

今、あなたは使用することができますへのXmlSerializerかにBinaryFormatterを(デ)オブジェクトをシリアル化

+0

ISerializableインターフェイスv.sを実装するのと同じですか? [Serializable]属性のマーク? – George2

+0

MSDN: "シリアル化される可能性のあるクラスは、SerializableAttributeでマークする必要があります。クラスがシリアル化プロセスを制御する必要がある場合は、ISerializableインターフェイスを実装できます。 結果は同じですが、属性はあなたのために機能します – RvdK

+0

感謝します。PoweRoy、Serializable属性でマークされていると、すべてのパブリックフィールドは自動的にシリアル化されますが、Serializableでマークされ、ISerializableインターフェイスGetObjectDateが空)、何も書き込まれません。とても奇妙。コメントはありますか? – George2

関連する問題