为什么使用 Xamarin 在 Android 上进行 XML 序列化会创建一个以 (char)65279 开头的字符串

Why does XML serialization on Android with Xamarin create a string that begins with (char)65279

我正在处理我们的移动应用程序中的一些崩溃问题,我正在努力尽可能地缩小问题范围。在此过程中,我发现了一些相当奇怪的行为。

这是在 Android 上使用 Xamarin。

我已将其分离为以下代码(为了保持简短而进行了简化):

// Using a very simple class:
public class A
{
}

// Then serializing it using XmlSerializer:
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(A));
using (MemoryStream memoryStream = new MemoryStream())
{
    serializer.Serialize(memoryStream, new A());

    var array = memoryStream.ToArray();
    var firstChar = System.Text.Encoding.UTF8.GetString(array,
        0, array.Length)[0];
    // look at firstChar in the watch window
}

firstChar 似乎是一个空字符,但是将 (int)firstChar 放入手表 window 会产生结果 65279.

我在桌面 PC 上使用 .NET 4.6.1 控制台应用程序尝试了完全相同的代码,结果第一个字符为 <,XML.[=17= 中的左括号]

我应该指出,在奇怪的第一个字符之后,XML 的其余部分是正确的 - 它只是有一个额外的字母作为前缀。

为什么 Android 有这种行为?我是否可以安全地删除第一个字符,以便我的 Android 应用程序的行为与我的 PC 应用程序相同,以便我可以进一步隔离导致崩溃的差异?

引自here

The reason for your result is because you are calling Encoding.UTF8.GetString, which is intended to convert a sequence of bytes in UTF8 encoding into a C# string.

65279是UTF-8 BOM的prepend

正如@Jason 所说,here,你可以这样做:

using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())
{
    var serializer = new XmlSerializer(typeof(A));
    Encoding utf8EncodingWithNoByteOrderMark = new UTF8Encoding(false);
    XmlTextWriter xtw = new XmlTextWriter(memoryStream, utf8EncodingWithNoByteOrderMark);
    serializer.Serialize(xtw, new A());
    string xml = Encoding.UTF8.GetString(memoryStream.ToArray());
    Log.Error("lv", xml[0]+"");
}

让您的 Android 应用与 PC 应用的行为相同。