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

时间:2009-12-24 11:30:49

标签: 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.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;

这是什么,我该如何解决这个问题?

3 个答案:

答案 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代码接受。