2

我有由 DataContractSerializer 生成的原始 XML 的内存流。这个字符串可以很长,并生成 60mb+ 的文件。然后我将其读入字符串,然后以 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

由于base64如果您读取多个 3000 字节(或任何其他 3 字节乘数)块,则将三个八位字节(字节)转换为四个编码字符,因此应该没有问题

有关base64 编码的更多信息,请参阅http://en.wikipedia.org/wiki/Base64

于 2013-09-19T14:57:52.880 回答
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 回答