C#base64对象序列化编码/解码问题

C#base64对象序列化编码/解码问题,c#,serialization,encoding,base64,decoding,C#,Serialization,Encoding,Base64,Decoding,我正在为我的项目(这是一个类)使用C#中的序列化和反序列化。 它们被序列化并保存到XML文件中。加载项目时,一切顺利 现在,我尝试将序列化项目编码为Base64,然后保存文件,这也很顺利。文件的第一行(编码之前!)如下所示: <?xml version="1.0" encoding="utf-8"?> <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3

我正在为我的项目(这是一个类)使用C#中的序列化和反序列化。 它们被序列化并保存到XML文件中。加载项目时,一切顺利

现在,我尝试将序列化项目编码为Base64,然后保存文件,这也很顺利。文件的第一行(编码之前!)如下所示:

<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
以及用于解码的代码:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
        return returnValue;

这可能是什么?我如何修复

文件声明自己为UTF-8-那么为什么要使用ASCII将其编码为二进制?UTF-8中有许多字符不能用ASCII表示。您甚至需要在内存中以文本形式存储文件吗?为什么不把它作为二进制数据加载(例如,
File.ReadAllBytes
)呢


如果确实需要以字符串开头,请使用
Encoding.UTF-8
(或
Encoding.Unicode
,尽管这可能会导致更大的字节数组),一切都应该正常。这个额外的字符是字节顺序标记-不能用ASCII表示,因此是“?”替换字符。

猜一猜?表示字节顺序标记,该标记是ASCII中无法表示的字符。为什么不使用UTF-8编码

byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);

与其担心编码,不如使用
XmlWriter.Create(outPath)
,然后将
XmlWriter
传递给序列化代码。这将避免此问题和其他问题(例如必须为大型对象图缓冲非常大的字符串)。有一个重载,它接受
XmlWriterSettings
以实现更精细的控制

XmlWriter
为大多数xml代码所接受

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
        return returnValue;
byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);