【问题标题】:XML deserialization with extra types throws error具有额外类型的 XML 反序列化会引发错误
【发布时间】:2020-06-18 10:08:10
【问题描述】:

在反序列化之前我不知道 XML 的类型。所以我使用XmlSerializerextraTypes 的重载。它适用于第一个type,但不适用于所有extraTypes。我收到以下错误消息"System.InvalidOperationException: There is an error in XML document (1, 40). ---> System.InvalidOperationException: <Bike xmlns=''> was not expected."。这是我正在尝试做的虚拟代码。

using System;
using System.IO;
using System.Xml.Serialization;

public class Program
{
    private const string CarXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Car xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"></Car>";
    private const string BikeXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Bike xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"></Bike>";


    public static void Main(string[] args)
    {
        var xmlSerializer = new XmlSerializer(typeof(Car), new[] { typeof(Bike) });

        using (var stringReader = new StringReader(BikeXml))
        {
            try
            {
                var vehicle = (Vehicle)xmlSerializer.Deserialize(stringReader);
                Console.WriteLine(vehicle.PrintMe());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

    }
}

public abstract class Vehicle
{
    public abstract string PrintMe();
}

public class Car : Vehicle
{
    public override string PrintMe()
    {
        return "beep beep I'm a car!";
    }
}

public class Bike : Vehicle
{
    public override string PrintMe()
    {
        return "bing bing I'm a bike!";
    }
}

【问题讨论】:

标签: c# deserialization xmlserializer


【解决方案1】:

显然extraTypes 不适用于我的情况。见msdn documentation

我通过获取 XmlRoot 解决了它。

public static void Main(string[] args)
{
    var xmlDocument = new XmlDocument();
    xmlDocument.LoadXml(BikeXml);
    var rootName = xmlDocument.DocumentElement.Name;
    var rootType = Type.GetType(rootName);
    var vehicle = rootType != null ? (Vehicle) Activator.CreateInstance(rootType) : null;        
    Console.WriteLine(vehicle != null ? vehicle.PrintMe() : "Error");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多