2009-03-20 12 views
1

C#でカスタム.NETシリアライザを作成していて、XmlReaderとXmlWriterを使用してXMLにArrayオブジェクトを読み書きしたいとします。私は、配列をbase64エンコードしたいと思います。配列は1次元、2次元または3次元で、要素はブール型または数値型です。Base64としてXMLに.NET配列をシリアル化しますか?

私は完全に困惑しています。 XmlReaderとXmlWriterには、Base64としてByte []配列を読み書きするメソッドがありますが、配列からByte []まで取得する方法を理解することはできません。

アレイが大きいので、アレイをコピーしたり、一度に1つの要素を処理したりすることを含まないソリューションを好むでしょう。安全でないコード、管理された、またはネイティブのC++は問題ありません。 XMLのために安全であれば、base64以外のものを使うことができます。

ご協力ありがとうございます。

答えて

1

使用している「アレイ」の種類によって、さまざまなオプションがあります。それは配列、リスト<>、またはArrayListですか?

リストの場合CopyTo()を使用すると、リストの一部を取得してバイナリ配列にすることができます。これをXmlWriterで書き込むことができます。それらをXmlReaderから読み取るには、単にInsertRangeを使用してデータを逆シリアル化します。

A読書例:

// elsewhere 
List<byte> bytes; 

// in the deserialization 
int bufferSize = 1024; 
byte[] buffer = new byte[bufferSize]; 
int index = 0; 
int numRead = -1; 

while (numRead != 0) // actually read stuff 
{ 
    numRead = reader.ReadContentAsBase64(buffer, bufferSize); 
    if (numRead > 0) 
    { 
     bytes.CopyTo(buffer, index, numRead); 
     index += numRead; 
    } 
} 

注:上記のコードは、テストされていませんが、おそらく近くにあります。似たようなことができますが、逆に、データをコード化してbase64に書き込むことができます。他の型の場合、配列をバイトのリストに変換するだけで済みます。

バイト以外のタイプをバイト配列に変換するには、System.BitConverterを使用する必要があります。これには、基本データ型をバイト配列に変換するGetBytesToInt32ToBooleanを含むToXxxという2つの方法があります。あなたは、あなたがBase64の情報を読んだ後、またはあなたがそれを書き出す前に、自分自身で変換を行う責任があります。

BitConverterを使用してバイトごとの変換を行うことはできますが、配列を1バイトの配列に変換して戻すアルゴリズムを設計するのはあなた次第です。

+0

これは、byte []またはint [、]などのSystem.Arrayです。 "バイナリアレイ"とはどういう意味ですか?どうすればXmlWriterでそれを書くでしょうか? –

+0

更新された例を参照してください。 :) –

+0

ああ、 '数値型またはブール型'。あなたはそれを書き出す前に、バイトベースの配列に変換する必要があります。 –

0

Base-64テキストを含む単一のXML要素で表される単一の配列が必要な場合、最も簡単な方法はBinaryFormatterを使用してデータ(任意の次元数の配列、Listなど)をそれから単純にbase-64でエンコードしてXMLファイルに貼り付けます。任意の配列をバイト配列に変換する他の簡単な方法は考えられません。

+0

はい、私はそれが最良の解決策かもしれないと思います。残念ながら、配列をBinaryFormatter出力にコピーする必要があります。これは避けたいものです。 –

0

私がやったことの簡単な要約: シリアル化のために、私はBinaryWriterを使って個々の要素をMemoryStreamにラップされたバイト配列に書き出します。私は小さなチャンクへの書き込みを分割して、MemoryStream配列は小さく留まります。チャンクをbase64でエンコードされたテキストの内容で個々のXML要素として記述します。

逆シリアル化はほとんど逆です。 base64チャンクはバイト配列にデコードされます。バイト配列はメモリストリームでラップされ、要素を結果配列にプッシュするためにBinaryReaderによって読み込まれます。

0

XmlSerializerを使用する場合は、DataTypeプロパティを "base64Binary"に設定してXmlElementAttributeをbyte []型のプロパティで指定できます。 hereを参照してください。

関連する問題