2016-09-07 39 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,现在没问题。上面的例子对其他泛型有帮助,所以非常感谢。 –