我有一个由DataContractSerializer生成的原始XML的内存流。这个字符串可能很长,并生成60mb +的文件。然后我将其读入一个字符串,然后以UTF8字节编码,然后转换为基本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或者使用流编写器写出字符串时遇到内存不足异常(那就是“编写器”是顺便说一句)。
我不太清楚如何解决这个问题。我认为也许是以“块”的形式阅读和转换原始流可能是前进的方式,但我不确定这将如何影响文件的读取。
答案 0 :(得分:1)
如果您读取多个3000字节(或任何其他3字节乘数)的块,base64
将三个八位字节(字节)转换为四个编码字符,那么应该没有问题
有关 base64编码的详细信息,请参阅 http://en.wikipedia.org/wiki/Base64
答案 1 :(得分: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));
}