2011-06-29 8 views
0

シリアル化でいくつかのスレッドを読んでいますが、私の質問には答えられませんでした。.Netオブジェクトの軽量文字列のシリアル化

私は単純な直列化ライブラリが必要です。これは、特定の属性でマークされたプロパティを反映し、その値を文字列として格納します。すべてのプロパティは直接文字列であるか、文字列(組み込みの値型、boolなど)との間で直接変換可能です。また、単純なコンテナ(一般的なリストなど)を理解し、それらのコンテンツをシリアライズする必要があります。

シリアライズで必要なコントロールは、どのプロパティを直列化するか(属性で修飾したもののみ)を指定することです。また、特定のプロパティが最後のものとしてシリアル化されていることを示す必要があります。最後のものとして直列化解除されます。

フォーマットは問題ではありません。ちょうど普通のparam1=val1, param2=val2と同じですが、JSONもXMLやエスケープまたはエンコードされたバイナリフォーマットと同様です。重要なのは、すべての設定をアプリケーションに格納して読み込むことができる1つの文字列ですべて設定できることです。

アイデア?

答えて

3

DataContractSerializerがあることありません - あなたは[DataContract]でシリアライズするクラス、そしてあなたが[DataMember]と、シリアライズしたいだけのメンバーを飾ります。また、DataMember属性のOrderプロパティを使用して、シリアル化の順序を制御することもできます。

DataContractSerializer(DCS)は、常にXMLなどのオブジェクトをシリアル化し、それが使用するXMLは、あなたが中にそれを渡したXmlWriterに応じて、タグの付いた「ノーマル」XML、またはよりコンパクトなバイナリ形式の両方にすることができますシリアル化(および逆シリアル化中のXmlReader)。生成されたXMLをより詳細に制御できるもう1つのオプションは、XmlSerializerクラスです。このクラスには、シリアライズを制御するための独自の属性があります。

次のコードは、DCS-シリアライズ可能なタイプとそのシリアライズの例を示します。

[DataContract] 
    public class Person 
    { 
     [DataMember(Order = 1)] 
     public string Name; 
     [DataMember(Order = 2)] 
     public int Age; 
     [DataMember(Order = 3)] 
     public Address Address; 
    } 
    [DataContract] 
    public class Address 
    { 
     [DataMember(Order = 1)] 
     public string Street; 
     [DataMember(Order = 2)] 
     public string City; 
     [DataMember(Order = 3)] 
     public string State; 
    } 
    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     XmlWriterSettings ws = new XmlWriterSettings 
     { 
      Indent = true, 
      IndentChars = " ", 
      Encoding = Encoding.UTF8, 
     }; 
     XmlWriter w = XmlWriter.Create(ms, ws); 
     DataContractSerializer dcs = new DataContractSerializer(typeof(Person)); 
     Person person = new Person 
     { 
      Name = "John", 
      Age = 22, 
      Address = new Address 
      { 
       Street = "1 Main St.", 
       City = "Springfield", 
       State = "ZZ", 
      } 
     }; 
     dcs.WriteObject(w, person); 
     w.Flush(); 
     Console.WriteLine("Serialized:"); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
     ms.Position = 0; 
     XmlReader r = XmlReader.Create(ms); 
     Person deserialized = (Person)dcs.ReadObject(r); 
     Console.WriteLine(deserialized); 
    } 
+0

良い例を!私の経験では、DataContractSerializerはほとんどの場合十分です。しかし、開発が深化し、柔軟性が必要になると、JSON.Netは非常に多くのオプションを提供します。それはDCSと同じ属性( 'DataMember'など)を尊重することさえあるので、それへの切り替えは非常に簡単です。 DCSが悪いと言っているわけではなく、JSON.Netは良いです。あなたのニーズに基づいているだけで、いずれかと一緒に行くことができます。 – Mrchief

+0

優れた例をありがとう。サードパーティのライブラリを使用するのではなく、一般的なものに固執することは常に良いことです。これはあなたのソリューションを本当に完璧にしてくれます〜 –

関連する問題