为什么使用 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 应用的行为相同。
我正在处理我们的移动应用程序中的一些崩溃问题,我正在努力尽可能地缩小问题范围。在此过程中,我发现了一些相当奇怪的行为。
这是在 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 应用的行为相同。