我正在使用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;
这是什么,我该如何解决这个问题?
答案 0 :(得分:7)
该文件将自己声明为UTF-8 - 那么为什么使用ASCII将其编码为二进制? UTF-8中有许多字符无法用ASCII表示。你甚至必须以文本形式在内存中开始使用文件吗?为什么不直接将其加载为二进制数据(例如File.ReadAllBytes
)?
如果做需要以字符串开头,请使用Encoding.UTF-8
(或Encoding.Unicode
,尽管这可能会导致更大的字节数组)并且一切都应该没问题。额外的字符是字节顺序标记 - 不能用ASCII表示,因此“?”替换角色。
答案 1 :(得分:2)
猜猜?表示字节顺序标记,它是一个无法用ASCII表示的字符。你为什么不使用UTF-8编码?
byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
答案 2 :(得分:0)
不必担心编码,也许只需使用XmlWriter.Create(outPath)
,并将XmlWriter
传递给序列化代码。这将避免此问题和其他问题(例如必须为大对象图缓冲非常大的字符串)。有一个重载接受XmlWriterSettings
以获得更好的控制。
XmlWriter
被大多数xml代码接受。