代码之家  ›  专栏  ›  技术社区  ›  William Moore

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

  •  2
  • William Moore  · 技术社区  · 11 年前

    我有一个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 回复  |  直到 11 年前
        1
  •  1
  •   Ovidiu    11 年前

    这是一段使用 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));
        }
    
        2
  •  1
  •   Mauricio Gracia Gutierrez    11 年前

    自从 base64 将三个八位字节(字节)转换为四个编码字符,如果您读取3000字节的多个块(或任何其他3字节乘法器),应该没有问题

    有关的更多信息 base64编码 看见 http://en.wikipedia.org/wiki/Base64