2016-09-07 41 views
0

我們遇到了一個自定義泛型類型拋出與序列化相關的異常的嚴重問題。下面是一個例子類:在UWP應用程序中添加泛型類型的運行時指令

internal class Foo<T> : IFoo<T> 
{ 
    public void Bar(T tralalala) 
    { 
     //do whatever 
    } 
} 

現在,我們使用Prism框架,其內置SessionStateService保存應用程序狀態,當它被關閉或暫停。問題是,當棱鏡嘗試重新推出後帶回的應用程序狀態,拋出一個異常:

System.Runtime.Serialization.InvalidDataContractException 
SerializationCodeIsMissingForType, Utilities.Foo.Foo`1[T] 

我清楚地意識到,爲了使串行器/解串器工作時,.NET本地編譯器需要爲該類型提供額外的元數據,如rd.xml文件中所標記的。問題是,我不知道如何標記該類型。我想整個命名空間的通用標籤將工作:

<Namespace Name="Utilities.Foo" Dynamic="Required All" DataContractSerializer="Required All" /> 

但是,這不是這種情況,我真的不能找到如何正確地標記一個泛型類型的任何實例。由於該序列化/反序列化問題使WACK測試無法通過,所以我們真的需要解決這個問題。 幫助我,堆棧溢出,你是我唯一的希望。

+1

我已經從.NET序列化程序團隊ping了一些人。我相信我們可以讓你擺平。對於這樣的事情,你總是可以通過[email protected]向我們發送郵件。樂於幫助! –

+0

當您使用或不使用.NET Native工具鏈編譯應用程序時,問題是否會發生? –

回答

0

您可以使用<TypeInstantiation>元素將反射策略設置爲構造的泛型類型。有關詳細信息,請參閱https://msdn.microsoft.com/en-us/library/dn627487(v=vs.110).aspx

例如,這裏的rd.xml文件我有富,

<?xml version="1.0" encoding="utf-8" ?> 
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> 
    <Application> 
    <Assembly Name="*Application*" Dynamic="Required All" /> 
    <TypeInstantiation Name="Foo" 
         Arguments="System.Int32" 
         DataContractSerializer="Required All" /> 
    <TypeInstantiation Name="Foo" 
         Arguments="System.String" 
         DataContractSerializer="Required All" /> 
    </Application> 
</Directives> 

我的測試程序進行測試Foo<int>Foo<string>,所以我有兩個TypeInstantiation條目和不同的Arguments屬性值,如上圖所示。

或者你可以使用下面的元素政策適用於所有類型的Foo<T>

<TypeInstantiation Name="Foo" DataContractSerializer="Required All" /> 

注意的元素沒有Arguments屬性。

+0

我想添加一些額外的上下文,因爲我在這個問題上花了相當一段時間。 –

+0

在完成我的評論之前,我已經設法發送了它。這裏的情況更復雜 - 我們一直在使用我們自己的弱事件模式實現,而不是反射沉默 - 嘗試序列化,這會導致SessionStateService出現故障。我們已將它從UWP Toolkit切換到WeakEventListener,現在沒問題。上面的例子對其他泛型有幫助,所以非常感謝。 –