在 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
属性。
我们遇到了一个严重的问题,自定义泛型类型抛出与序列化相关的异常。这是一个例子 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
属性。