Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将原始XML字符串可靠地写入文件,写入base-64编码字符串?_C#_Base64_Streamreader_Datacontractserializer_Streamwriter - Fatal编程技术网

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

C# 如何将原始XML字符串可靠地写入文件,写入base-64编码字符串?,c#,base64,streamreader,datacontractserializer,streamwriter,C#,Base64,Streamreader,Datacontractserializer,Streamwriter,我有DataContractSerializer生成的原始XML的内存流。该字符串可能相当长,并生成60mb+的文件。然后我把它读入一个字符串,然后用UTF8字节编码,然后转换成一个base 64字符串。以下是一段代码片段: // serialize to a memory stream. rawXML = new MemoryStream(); dcs = new DataContractSerializer(vToWrite.GetType(), null, 2147483647,

我有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或使用流编写器(顺便说一下,这就是“编写器”)将字符串写入时,会遇到内存不足异常


我不太确定如何解决这个问题。我认为在“块”中读取和转换原始流可能是前进的方向,但我不确定这将如何影响文件的读回

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


有关base64编码的更多信息,请参见

这里有一段代码,它使用字节数组并将其转换为块中的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));
    }

我有点困惑,为什么要将原始字节流读入字符串,然后将字符串转换回原始字节流。为什么不让DataContractSerializer在UTF8中写入,从MemoryStream中获取内存缓冲区,然后对其进行base64编码?您将为字符串和调用GetBytes分配的临时缓冲区保存内存。如何让DataContractSerializer以UTF8写入?创建默认为UTF-8的
XmlWriter
,并将其传递给
dcs.WriteObject
。因此,它不是直接写入
MemoryStream
,而是写入
XmlWriter
,后者由
MemoryStream
支持。请参阅。如何确保我将拥有的字节数是3的倍数?事实上,base 64知道如何在最后一个字节块不是3的倍数时执行填充,请参阅我包含的链接