私は具体的には約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)
したがって、私はこのようなシリアライザを作成する: 'var s = new DataContractSerializer(typeof(Foo))'そして後でこの 's.WriteObject(myStream、myBar)のように' Bar'のインスタンスを直列化したい'、' 'foo ''タグ内の' 'Bar'をシリアル化しますか?これはプロパティを非直列化しますか? – JamesFaix
更新された回答をご覧ください。デシリアライズは、シリアライザが同じ方法で構築されている限り動作します。 –
ありがとうございます。 DataContractのシリアル化APIは非常に簡潔で、私はそれを考え続けます。 – JamesFaix