【问题标题】:.NETCore XmlSerializer error.NETCore XmlSerializer 错误
【发布时间】:2017-06-14 13:05:12
【问题描述】:

我有一个在 .NETFramework 4.6.1 上运行的应用程序,对抽象类和继承类型使用 xml 序列化,方法与 XML Serialization and Inherited Types 几乎相同,而且效果很好。但是在将应用程序移植到 UWP .NETCore 之后,我遇到了一个奇怪的异常。这是一个重现它的简单示例。

public class ClassToSerialize
{
    [XmlElement(Type = typeof(CustomSerializer<AnotherOne>))]
    public AnotherOne anotherOne;

    public ClassToSerialize()
    {
    }
}

public abstract class AnotherOne
{
    public AnotherOne()
    {
    }
}

public class CustomSerializer<TType> : IXmlSerializable
{
    public CustomSerializer()
    {
    }

    public CustomSerializer(TType data)
    {
        m_data = data;
    }

    public static implicit operator CustomSerializer<TType>(TType data)
    {
        return data == null ? null : new CustomSerializer<TType>(data);
    }

    public static implicit operator TType(CustomSerializer<TType> obj)
    {
        return obj.m_data;
    }

    private TType m_data;

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
    }

    public void WriteXml(XmlWriter writer)
    {
    }
}

并为此类型创建 XmlSerializer

XmlSerializer sr = new XmlSerializer(typeof(ClassToSerialize));

导致异常

System.InvalidOperationException: TestApp.AnotherOne, TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null is notassignable from TestApp.CustomSerializer`1[[TestApp.AnotherOne, TestApp, Version=1.0.0.0, Culture =neutral, PublicKeyToken=null]], TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

相同的代码适用于 .netframework 应用程序。他们是否更改了 .netcore 中的某些内容,还是我遗漏了什么?

【问题讨论】:

  • 你在 UWP 上重新编译了吗?如果没有,那么您需要在 UWP 上发布和安装。不同版本的网络库在 windows dll 中的偏移量是不同的,因此除非网络库的版本完全相同,否则仅移动可执行文件是行不通的。
  • 是的,我没有使用桥接器,而是将项目重新创建为新的通用应用程序项目并使用 .NETCore.UniversalWindowsPlatform 5.3.3 包编译。
  • 我遇到了完全相同的问题。您找到解决方案了吗?
  • @wexman 是的,有点。我摆脱了属性 [XmlElement(Type = typeof(CustomSerializer))],因为这是异常的原因,并重新设计了我的序列化系统。创建 XmlSerializer 时,您可以为序列化器提供其他类型的列表,因此使用反射我递归地收集了我想要序列化的类中的所有嵌套类型,并将它们传递给 XmlSerializer 构造函数
  • @Alex 谢谢,但恐怕这对我来说是不可能的。实际上,我现在已经在github.com/dotnet/corefx/issues/35691 上打开了一个问题,但它似乎并没有以某种方式得到解决。也许你想在那里发表评论......

标签: c# .net xml xml-serialization .net-core


【解决方案1】:

您的问题与表示序列化类型的类型相关联。对于通用应用程序,它们必须来自(如我所见) 例如:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        XmlSerializer sr = new XmlSerializer(typeof(ClassToSerialize));
        var demo = new DemoChild();
        var ser = new ClassToSerialize {anotherOne = demo};
        var stream = new MemoryStream();
        sr.Serialize(stream, ser);
    }
}

public class ClassToSerialize
{
    [XmlElement(Type = typeof(DemoChild))]
    public AnotherOne anotherOne;

    public ClassToSerialize()
    {
    }
}

public abstract class AnotherOne : IXmlSerializable
{
    protected AnotherOne()
    {
    }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
    }

    public void WriteXml(XmlWriter writer)
    {
    }
}

public class DemoChild: AnotherOne
{
}

使用泛型序列化程序对您来说很重要吗?我已经在通用 App 单元测试中进行了测试,并且一切正常。

附:类型 - 从成员类型派生的对象的类型。来自文档

【讨论】:

    【解决方案2】:

    使用 XAML 序列化程序:

    nuget&gt; Install-Package Portable.Xaml

    public class ClassToSerialize
    {
        public AnotherOne anotherOne { get; set; }
    
        public ClassToSerialize()
        {
        }
    }
    
    
    public abstract class AnotherOne
    {
        public AnotherOne()
        {
        }
    }
    
    public class ContainerOne : AnotherOne
    {
        public uint placeholder = 0xdeadcafe;
    }
    
    
    
    public void Test()
    {
        ClassToSerialize obj = new ClassToSerialize();
        obj.anotherOne = new ContainerOne();
    
        //or FileStream..
        using (MemoryStream ms = new MemoryStream())
        {
            Portable.Xaml.XamlServices.Save(ms, obj);
            ms.Seek(0, SeekOrigin.Begin);
            ClassToSerialize obj2 = Portable.Xaml.XamlServices.Load(ms) as ClassToSerialize;
        }
    }
    

    【讨论】:

      【解决方案3】:

      尝试从 Nuget 下载 System.Xml.XmlSerializer。我认为它是在.NETStandard 开发的 这里lists all versions of .NET Standard and the platforms supported

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        相关资源
        最近更新 更多