4

使用したいのですが、そのメソッドのパラメーターDataContractSerializerについて混乱しています。またはのいずれかを使用できることがわかります。知りたいのですが: StreamWriteObjectMemoryStreamXmlWriter

  • シリアル化はストリームの選択によってどのように影響を受けますか?オブジェクトのサイズに影響しますか?
  • を使用する場合MemoryStream、常にバイナリオブジェクトを取得しますか?

これらの質問は基本的なものかもしれませんが、私はグーグルしていて、明確な答えを見つけることができません。ありがとう。

4

2 に答える 2

2

DataContractSerializer本質的にxmlベースのシリアライザーです。を渡すと、ストリームをラップStreamするXmlWriter(具体的にはXmlDictionaryWriter)が作成され、コアシリアル化コードがに書き込みますXmlWriter

シリアル化はストリームの選択によってどのように影響を受けますか?オブジェクトのサイズに影響しますか?

異なるStreamインスタンスを使用しても、内部で何が起こるかには影響しませんが、エンコーディングが何であるかに応じて、を渡す場合と比較して、ここではわずかな違いがあります。を渡すと、UTF-8を使用します。ただし、これを渡すと、さまざまなエンコーディングを指定できます。XmlWriterStreamDataContractSerializerXmlWriter

を使用する場合MemoryStream、常にバイナリオブジェクトを取得しますか?

MemoryStreamはのラッパーでありbyte[]、そうです。後で呼び出し.ToArray()た後は、バイナリだけになります。ただし、これもxmlであるのはバイナリです。それは両方である可能性があります。

実際にバイナリであるシリアル化(つまり、xml / json / csvなどではなく基本的にバイナリシリアル化形式)が必要な場合は、protobuf-netのようなものを検討してください。

于 2012-09-11T08:22:14.407 に答える
1

WriteObjectMarcが言うように、オーバーロードを使用する場合、Streamによってストリームに書き込まれるバイトは、渡されるインスタンスDataContractSerializerのタイプに関係なく、XMLドキュメントのUTF-8エンコードされたテキストを構成します。 Streama MemoryStream、最終的にはメモリ内のバイト配列になりますが(これはMemoryStreamであるため)、これらのバイトはUTF-8でエンコードされたXMLテキストで構成されます。これは通常はバイナリ表現として記述されません。

WriteObjectがかかるオーバーロードを使用する場合、XmlWriter最終的に何ができるかXmlWriterは、自分のタイプと、それがどのように初期化されているかによって完全に決まります。に関する限り、オブジェクトの状態を表すXMLインフォセットを記述するために、適切なパターンでDataContractSerializerのメソッドを呼び出します。XmlWriterそのインフォセットがどのようにエンコードされるかは、の実装によって異なりますXmlWriter

特殊な要件があり、特にマゾヒスティックな場合は、独自のカスタムXmlWriterを実装して、任意の種類のエンコード、圧縮、暗号化を行うことができます。またはXmlTextWriter、を渡すこともできます。これにより、インフォセットのテキストエンコーディング(ストリームオーバーロードなど)が提供されますが、文字エンコーディングとテキストフォーマットを制御するためのオプションが増えます。通常は、を渡します。XmlDictionaryWriterその後、作成方法に応じて、エンコードにさまざまなオプションがあります。

これらのオプションには、XMLインフォセットのWCF独自のバイナリエンコーディングが含まれます。これを使用してインスタンスを作成しますXmlDictionaryWriter.CreateBinaryWriter。WCFチームは、WCFのパフォーマンス目標を達成するために、効率的なバイナリ表現の設計に多大な労力を費やしたため、結果が確実に得られるという条件で、より良いオプションを考え出すのは難しいと思います。シリアル化されたオブジェクトは、.NETコードによってのみ逆シリアル化する必要があります。公開標準ベースのバイナリ表現が必要な場合は、代わりにのMTOMフレーバーを検討してくださいXmlDictionaryWriter

于 2012-09-11T12:25:15.600 に答える