2016-09-07 9 views
0

У нас серьезная проблема с настраиваемым родовым типом, исключающим исключения, связанные с сериализацией. Вот пример класса:Добавление директив среды выполнения для общих типов в приложении UWP

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] 

Я хорошо знаю, что для того, чтобы сериализатором/десериализатор на работу, родной компилятор .NET необходимы дополнительные метаданные для этого типа, как указано в файлах rd.xml. Проблема в том, что я не в курсе, как отмечать этот тип. Я думал, что общий тег для всего пространства имен будет работать:

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

Но это не так, и я не могу найти ни одного примера того, как правильно отмечать общий тип. Поскольку эта проблема сериализации/десериализации делает передачу теста WACK невозможной, нам действительно нужно решить проблему. Помогите мне, переполнение стека, вы - моя единственная надежда.

+1

Я ping'd некоторых людей из команды .NET serializer. Я уверен, что мы сможем убедить вас. Для таких вещей вы всегда можете снимать нам почту на [email protected] Рад был помочь! –

+0

Возникает ли проблема при компиляции приложения с помощью или нет цепочки инструментов .NET. –

ответ

0

Вы можете использовать элемент <TypeInstantiation> для настройки политики отражения на построенные общие типы. См. https://msdn.microsoft.com/en-us/library/dn627487(v=vs.110).aspx.

Например, вот файл rd.xml я имел для Foo,

<?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 сходить с ума. Мы переключили его на WeakEventListener из UWP Toolkit, и теперь все в порядке. Приведенный выше пример полезен для других родовых типов, поэтому большое спасибо. –