2016-09-14 5 views
0

Я тестирую приложение в режиме выпуска, и это не удается при сериализации моих данных с InvalidDataContractException со ссылкой на SerializationCodeIsMissingForType.Как определить массив в файле Default.rd.xml

К процессу устранения объектов, которые не выполняют сериализацию в режиме Release (not Debug), являются Row [], Column [], которые являются просто массивами простых классов.

мне удалось сериализация моих других объектов, добавляя Default.rd.xml запись, как:

<Namespace Name="Windows.UI"> 
    <TypeInstantiation Name="Color" Arguments="System.Byte, System.Byte, System.Byte, System.Byte" Dynamic="Required All" DataContractSerializer="Required All"/> 
</Namespace> 

Я озадачен, пытаясь придумать правильную запись TypeInstantiation для System.Array как я не» t знать, что использовать для обязательного параметра Аргументы.

Может ли кто-нибудь помочь мне, или я не нахожусь на неправильном пути?

Благодаря ...

Роберт

+0

Вы можете добавить как 'Row' и класс' column' к вашему коду, пожалуйста? – rbr94

ответ

0

мне удалось получить его работу на много проб и ошибок. Очевидно, что все было построено и протестировано в режиме отладки, поэтому был список объектов, которые были сериализованы, что не удалось создать сборку с SerializationCodeIsMissingForType.

Чтобы помочь другим (так как примеров еще не так много), это было мое путешествие.

Мой сериализации код следующим образом:

persistantData = new Dictionary<string, object>(); 

      persistantData.Add(nameof(Version), Version); 
      persistantData.Add(nameof(FileVersion), FileVersion); 
      persistantData.Add(nameof(ScrollParameters), ScrollParameters); 
      persistantData.Add(nameof(DefaultCellBackgroundColour), DefaultCellBackgroundColour); 
      persistantData.Add(nameof(Columns), Columns); 
      persistantData.Add(nameof(Rows), Rows); 
      persistantData.Add(nameof(Cells), listOfCellData); 
      persistantData.Add(nameof(Filename), FileName); 

private async Task SaveTheFileAsync(StorageFile file) 
{ 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
    var serializer = new DataContractSerializer(typeof(Dictionary<string, object>)); 
    serializer.WriteObject(memoryStream, persistantData); //Failed here 

... и т.д.

Сначала я закомментировать все .Add() S выше, за исключением первого. То же самое исключение SerializationCodeIsMissingForType произошло, пока я не добавил следующее в стандартный файл Default.rd.xml в свойствах моего проекта, чтобы определить словарь типа коллекции:

<Namespace Name="System.Collections.Generic"> 
    <TypeInstantiation Name="Dictionary" Arguments="System.String, System.Object" Dynamic="Required All" /> 
</Namespace> 

Добавление объекта Версии обратно необходимое это для добавления По умолчанию. rd.xml (версия имеет тип PackageVersion).

<Namespace Name="Windows.ApplicationModel"> 
     <TypeInstantiation Name="PackageVersion" Arguments="System.UInt16, System.UInt16, System.UInt16, System.UInt16" Dynamic="Required All" DataContractSerializer="Required All" />  
</Namespace> 

Добавление FileVersion немедленно сработало, так как его тип - int. Аналогично ScrollParameters, поскольку это класс, содержащий два двойника и поплавок.

DefaultCellBackgroundColour необходимо это в Default.rd.xml:

<Namespace Name="Windows.UI"> 
    <TypeInstantiation Name="Color" Arguments="System.Byte, System.Byte, System.Byte, System.Byte" Dynamic="Required All" DataContractSerializer="Required All"/> 
</Namespace> 

Столбцы, строки и ячейки, необходимые отдельные записи типа в Default.rd.xml:

<Type Name="Columns" Dynamic="Required All" DataContractSerializer="All" /> 
<Type Name="Rows" Dynamic="Required All" DataContractSerializer="All" /> 
<Type Name="CellData" Dynamic="Required All" DataContractSerializer="All" /> 

Но так как CellData был список сбор данных, которые необходимо добавить в System.Collections.Generic для имени пространства имен (после словаря) следующим образом:

<Namespace Name="System.Collections.Generic"> 
    <TypeInstantiation Name="Dictionary" Arguments="System.String, System.Object" Dynamic="Required All" DataContractSerializer="Required All" /> 
    <TypeInstantiation Name="List" Arguments="CellData" Dynamic="Required All" DataContractSerializer="All" /> 
</Namespace> 

Также определение CellData содержит в основном строки, целые числа, логические и десятичные числа, но одно свойство определяется как TextAlignment. Последнему нужна была собственная запись в Default.rd.XML, как это:

<Namespace Name="Windows.UI.Xaml"> 
    <TypeInstantiation Name="TextAlignment" Arguments="System.Enum" Dynamic="Required All" DataContractJsonSerializer="Required All"/> 
</Namespace> 

Наконец FileName (строка) не требуется никакой дополнительной записи Default.rd.xml и все это работало.

Благодаря rbr94 за помощь. Заголовок этого вопроса теперь вводит в заблуждение, поскольку определения массивов не требуются.

Моего полный файл Default.rd.xml ниже

Надеются, что это поможет кому-то, когда-нибудь ...

Роберт

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> 
    <Application> 
    <!-- 
     An Assembly element with Name="*Application*" applies to all assemblies in 
     the application package. The asterisks are not wildcards. 
    --> 
    <Assembly Name="*Application*" Dynamic="Required All" /> 

    <!-- Add your application specific runtime directives here. --> 

    <!-- Make all members of a type visible to .NET Native --> 
    <Type Name="Columns" Dynamic="Required All" DataContractSerializer="All" /> 
    <Type Name="Rows" Dynamic="Required All" DataContractSerializer="All" /> 
    <Type Name="CellData" Dynamic="Required All" DataContractSerializer="All" /> 

    <Namespace Name="System.Collections.Generic"> 
     <TypeInstantiation Name="Dictionary" Arguments="System.String, System.Object" Dynamic="Required All" DataContractSerializer="Required All" /> 
     <TypeInstantiation Name="List" Arguments="CellData" Dynamic="Required All" DataContractSerializer="All" /> 
    </Namespace> 

    <Namespace Name="Windows.ApplicationModel"> 
      <TypeInstantiation Name="PackageVersion" Arguments="System.UInt16, System.UInt16, System.UInt16, System.UInt16" Dynamic="Required All" DataContractSerializer="Required All" />  
    </Namespace> 

    <Namespace Name="Windows.UI"> 
     <TypeInstantiation Name="Color" Arguments="System.Byte, System.Byte, System.Byte, System.Byte" Dynamic="Required All" DataContractSerializer="Required All"/> 
    </Namespace> 

    <Namespace Name="Windows.UI.Xaml"> 
     <TypeInstantiation Name="TextAlignment" Arguments="System.Enum" Dynamic="Required All" DataContractJsonSerializer="Required All"/> 
    </Namespace> 


    </Application> 
</Directives> 

 Смежные вопросы

  • Нет связанных вопросов^_^