C#基于对象序列化的Base64编码/解码问题

5
我正在使用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">

当我解码文件时,在该行前面添加了一个?
?<?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[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
        string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
        return returnValue;

解码的代码如下:

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

这是什么问题,我该如何解决?
(Translated and polished)
3个回答

8
文件声明为UTF-8,为什么要使用ASCII编码将其转换为二进制?UTF-8中有许多ASCII无法表示的字符。您是否必须将文件存储为文本形式进行内存处理?为什么不直接将其作为二进制数据加载(例如,File.ReadAllBytes)?
如果您确实需要从字符串开始处理,请使用Encoding.UTF-8(或Encoding.Unicode,但这可能会导致更大的字节数组),一切都应该正常。那个额外的字符是字节顺序标记 - 在ASCII中无法表示,因此会出现“?”替换字符。

2

猜测中的“?”代表字节顺序标记(Byte-Order-Marker),这是一个在ASCII中无法表示的字符。为什么不使用UTF-8编码?

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

0
与其担心编码问题,不如直接使用XmlWriter.Create(outPath),并将该XmlWriter传递给序列化代码。这样可以避免此类问题以及其他问题(例如必须为大型对象图缓冲非常大的字符串)。有一个重载版本可接受XmlWriterSettings以进行更精细的控制。 XmlWriter被大多数xml代码所接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接