XML序列化在Windows上工作,但在Android上不工作

bvjxkvbb  于 2023-05-05  发布在  Android
关注(0)|答案(1)|浏览(135)

我尝试从存储中加载一个XML文件,如下所示:

var serializer = new XmlSerializer(typeof(AppModel));
var txt = File.ReadAllText(path);
if (txt.Length > 0)
{
    using (var stringReader = new StringReader(txt))
    {
        var ret = (AppModel)serializer.Deserialize(stringReader);
        return ret;
    }
}

在Windows上一切正常,但在Android上会抛出异常:
System.InvalidOperationException:'XML文档(0,0)中有错误。内部异常:缺少根元素。
但是我设置了RootElement,正如我所说的,这在Windows上工作,字符串也正确加载:

[Serializable]
[XmlRoot("AppModel")]
public class AppModel
{
    //...
}

我错过什么了吗?

olmpazwi

olmpazwi1#

您遇到的问题很可能是由文件开头的UTF-8字节顺序标记(BOM)引起的,XML序列化程序无法处理这种情况。
处理此问题的一种方法是检查BOM是否存在,然后在解析或反序列化string之前将其删除(类似于在this answer中的操作)。
为此,您可以创建一个sanitizer扩展方法,如下所示:

public static string RemoveByteOrderMark(this string str)
{
    var bom = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
    return str.StartsWith(bom) ? str.Remove(0, bom.Length) : str;    
}

然后在反序列化XML之前使用它:

var serializer = new XmlSerializer(typeof(AppModel));
var txt = File.ReadAllText(path);
if (txt.Length > 0)
{
    var sanitizedTxt = txt.RemoveByteOrderMark();

    using (var stringReader = new StringReader(sanitizedTxt))
    {
        var ret = (AppModel)serializer.Deserialize(stringReader);
        return ret;
    }
}

这将解决Android的问题。

相关问题