2

DataContractSerializer によって生成された生の XML のメモリ ストリームがあります。この文字列は非常に長くなる可能性があり、60 MB 以上のファイルが生成されます。次に、これを文字列に読み取り、UTF8 バイトでエンコードしてから、base 64 文字列に変換します。コード スニペットを次に示します。

// serialize to a memory stream.
rawXML = new MemoryStream();

dcs = new DataContractSerializer(vToWrite.GetType(),
    null, 2147483647, false, false, null, new ClassResolver());

dcs.WriteObject(rawXML, vToWrite);
rawXML.Seek(0, SeekOrigin.Begin);

// read the stream into a raw string of XML
sr = new StreamReader(rawXML);
xmlString = sr.ReadToEnd();
rawXML.Close();
sr.Close();

// encode into base64
//bytesToEncode = Encoding.UTF8.GetBytes(xmlString);
//encodedText = Convert.ToBase64String(bytesToEncode);

// write string out
writer = File.CreateText(fullPath + "Module" + i + "D" +
    historicDataCount +  ".bin");

writer.Write(Convert.ToBase64String(
    Encoding.UTF8.GetBytes(xmlString)));// (encodedText);

writer.Close();
// end save mod day //     

私が得ている問題は、ストリームをxmlStringに読み込むとき、またはストリームライターを使用して文字列を書き出すときに、メモリ不足の例外が発生することがあることです(ちなみに「ライター」とはそうです)。

これを解決する方法がよくわかりません。元のストリームを「チャンク」で読み取って変換することがおそらく前進だと思いますが、これがファイルの読み取りにどのように影響するかはわかりません。

4

2 に答える 2

1

System.Security.Cryptography.ToBase64Transformを使用し、バイト配列をチャンク単位で base64 に変換するコードを次に示します。

// write string out
byte[] data = Encoding.UTF8.GetBytes(xmlString);

using (StreamWriter writer = File.CreateText(fullPath + "Module" + i + "D" + historicDataCount +  ".bin"))
    using (ToBase64Transform transformation = new ToBase64Transform())
    {                    
        byte[] buffer = new byte[transformation.OutputBlockSize];

        int i = 0;    
        while (data.Length - i > transformation.InputBlockSize)
        {
            transformation.TransformBlock(data, i, data.Length - i, buffer, 0);
            i += transformation.InputBlockSize;
            writer.Write(Encoding.UTF8.GetString(buffer));
        }

        // final block
        buffer = transformation.TransformFinalBlock(data, i, data.Length - i);
        writer.Write(Encoding.UTF8.GetString(buffer));
    }
于 2013-09-19T16:49:57.283 に答える
1

3000 バイト (または他の 3 バイト乗数) の複数のチャンクを読み取る場合、3 オクテット (バイト) を 4 つのエンコードされた文字に変換するためbase64、問題はないはずです。

base64 エンコーディングの詳細については、 http://en.wikipedia.org/wiki/Base64を参照してください。

于 2013-09-19T14:57:52.880 に答える