2017-06-14 60 views
0

我有一個應用程序runnin .NETFramework 4.6.1,使用xml序列化抽象類和繼承類型,方法幾乎與此XML Serialization and Inherited Types相同,並且它工作得很好。但是將應用程序移植到UWP .NETCore之後,我遇到了一個奇怪的例外。這是一個簡單的例子來重現它。.NETCore XmlSerializer錯誤

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 sr = new XmlSerializer(typeof(ClassToSerialize)); 

創建XmlSerializer的會導致異常

System.InvalidOperationException:TestApp.AnotherOne,TestApp,版本= 1.0.0.0,文化=中立,公鑰= null不能從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中改變了一些東西,還是我錯過了一些東西?

+0

你重新編譯的UWP?如果沒有,那麼你需要在UWP上發佈和安裝。不同版本的Net Library偏移到windows dll中是不同的,所以只要移動的可執行文件不起作用,除非網絡庫的版本完全相同。 – jdweng

+0

是的,我沒有使用橋接器,項目被重新創建爲一個新的應用程序項目,並使用.NETCore.UniversalWindowsPlatform 5.3.3包進行編譯。 – Alex

回答

0

您的問題與表示序列化類型的類型鏈接。

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

使用通用串行對你很重要:對於通用的應用程序必須從(我可以看到) 例如衍生?我已測試通用應用程序單元測試,並且所有工作都正常。

P.s. Type - 從成員類型派生的對象。從技術文檔

0

使用XAML串行:

nuget> Install-Package Portable.Xaml