如何可靠地将原始XML字符串写入文件到base-64编码的字符串?

时间:2013-09-19 14:12:19

标签: c# base64 streamreader datacontractserializer streamwriter

我有一个由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或者使用流编写器写出字符串时遇到内存不足异常(那就是“编写器”是顺便说一句)。

我不太清楚如何解决这个问题。我认为也许是以“块”的形式阅读和转换原始流可能是前进的方式,但我不确定这将如何影响文件的读取。

2 个答案:

答案 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));
    }