2016-05-18 4 views
0

私は具体的には約DataContractSerializerを求めているが、これは、これらのシリアライザタイプのコンストラクタは、引数としてTypeオブジェクトを取り、各シリアライザのインス​​タンスのみが、このタイプのオブジェクトをシリアル化することができますもXmlSerializer.NET DataContractSerializerインスタンスでは、コンストラクタに渡された型をチェックできますか?

に関連しています。

このタイプを後で確認する方法はありますか?これを行う明示的なgetのプロパティまたはメソッドはありません。


私は最終的には、メモリ内の文字列にXMLとしてオブジェクトをシリアライズ簡素化するためにDataContractSerializerに拡張メソッドを作成しようとしています。

この拡張メソッドでは、型のチェックはミッションクリティカルではありませんが、より明確な例外処理が可能になると思います。チェックを外すと、ユーザはArguemntExceptionではなくSerializationExceptionになります。

public static string WriteObjectToString(this DataContractSerializer serializer, object obj) { 
    if (serializer == null) 
     throw new ArgumentNullException(nameof(serializer)); 
    if (obj == null) 
     throw new ArgumentNullException(nameof(obj)); 

    //--------------------------- 
    //This statement will not compile: 
    if (serializer.TypeToSerialize != obj.GetType()) 
     throw new ArgumentException("Invalid type."); 
    //--------------------------- 

    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output)) { 
     serializer.WriteObject(writer, obj); 
     return output.GetStringBuilder().ToString(); 
    }   
} 

A多少関連する質問:

DataContractSerializerは(ジェネリックがXmlSerializerとは異なり、.NETに導入された後に作成された)ジェネリック型ではなく、Typeオブジェクトパラメータを使用する理由はあります?あなたの最初の仮定が間違っている

  • void WriteObject(Stream, T)
  • T ReadObject(Stream)

答えて

1

のような方法でDataContractSerializer{T}を持つように単純ではないでしょう。 DataContractSerializerは、コンストラクタでknownTypesを渡すと、さまざまな種類のオブジェクトをシリアル化できます。しかし、結果として得られるxmlは、ルートxml要素名として最初の型名を使用します。

以下のサンプルコードは動作するはずです:DataContractSerializerを作成する必要はありませんので、

<Foo><Bar>...</Bar></Foo> 

希望この情報は、あなたのデザインを変更します:

DataContractSerializer serializer = new DataContractSerializer(typeof(Foo), new Type[] {typeof(Bar), }); 
Bar bar = new Bar(); 
serializer.WriteObject(stream, bar); 

結果のXMLは次のようになります。タイプごとのオブジェクト。しかし、それはなぜジェネリックがDataContractSerializerで使われないのかを説明するはずです。

+0

したがって、私はこのようなシリアライザを作成する: 'var s = new DataContractSerializer(typeof(Foo))'そして後でこの 's.WriteObject(myStream、myBar)のように' Bar'のインスタンスを直列化したい'、' 'foo ''タグ内の' 'Bar'をシリアル化しますか?これはプロパティを非直列化しますか? – JamesFaix

+0

更新された回答をご覧ください。デシリアライズは、シリアライザが同じ方法で構築されている限り動作します。 –

+0

ありがとうございます。 DataContractのシリアル化APIは非常に簡潔で、私はそれを考え続けます。 – JamesFaix

関連する問題