2017-06-14 4 views
0

Ich habe eine Anwendung runnin .NETFramework 4.6.1, XML-Serialisierung für abstrakte Klassen und vererbte Typen, mit Ansatz fast identisch mit diesem XML Serialization and Inherited Types, und es funktioniert gut. Aber nach der Portierung der Anwendung auf UWP .NETCore habe ich eine seltsame Ausnahme festgestellt. Hier ist ein einfaches Beispiel, um es zu reproduzieren..NETCore XmlSerializer Fehler

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) 
    { 
    } 
} 

Und XmlSerializer zu schaffen für diese Art

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

verursacht Ausnahme

System.InvalidOperationException: TestApp.AnotherOne, TestApp, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null ist nicht zuweisbar von TestApp.CustomSerializer`1 [[TestApp.AndereOne, TestApp, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null]], TestApp, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null.

Derselbe Code funktioniert in. Netframework App. Haben sie etwas in .netcore geändert oder fehle ich etwas?

+0

Haben Sie neu kompilieren auf UWP? Wenn nicht, dann müssen Sie auf UWP veröffentlichen und installieren. Verschiedene Versionen von Net Library-Offsets in Windows-DLLs sind unterschiedlich, sodass das Verschieben von ausführbaren Dateien nur funktioniert, wenn die Version von Net Libraries genau gleich ist. – jdweng

+0

Ja, ich habe keine Bridge verwendet, das Projekt wurde als neues uniersales App-Projekt erstellt und mit .NETCore.UniversalWindowsPlatform 5.3.3-Paket kompiliert. – Alex

Antwort

0

Ihr Problem, das mit dem Typ verbunden ist, der den Serialisierungstyp darstellt. Für den universellen App ihre muss abgeleitet werden Zum Beispiel (ich sehe):

[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 
{ 
} 

generic Serializer verwenden ist wichtig für Sie? Ich habe den universellen App Unit Test getestet und alles funktioniert einwandfrei.

Ps.s. Typ - Die Eigenschaft eines vom Typ des Elements abgeleiteten Objekts. Von Dokumentation

0

Verwenden XAML Serializer:

nuget> Install-Package Portable.Xaml