在 UWP 应用程序中为泛型类型添加运行时指令

Adding runtime directives for generic types in UWP app

我们遇到了一个严重的问题,自定义泛型类型抛出与序列化相关的异常。这是一个例子 class:

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

现在,我们使用 Prism 框架及其内置的 SessionStateService 在应用程序关闭或暂停时保存应用程序状态。问题是,当 Prism 尝试在重新启动后恢复应用程序状态时,抛出异常:

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

我很清楚,为了使 serializer/deserializer 正常工作,.NET Native 编译器需要为该类型提供额外的元数据,如 rd.xml 文件中所标记。问题是,我不知道如何标记该类型。我认为整个命名空间的通用标记会起作用:

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

但事实并非如此,我真的找不到任何有关如何正确标记泛型类型的示例。由于 serialization/deserialization 问题导致无法通过 WACK 测试,因此我们确实需要解决该问题。 帮助我,Stack Overflow,你是我唯一的希望。

您可以使用 <TypeInstantiation> 元素为构造的泛型类型设置反射策略。有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/dn627487(v=vs.110).aspx

例如,这是我为 Foo 准备的 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 属性。