2016-02-09 2 views
2

В настоящее время я переношу код на PCL (основные задачи .NET 4.5 + mobile через Xamarin), и я столкнулся с знакомой проблемой, сериализации классов, полученных из несериализуемых зависимостей. Я использую атрибуты DataContract/Member с DataContractJsonSerializer, и поэтому в непереносной версии этого сценария я использовал IDataContractSurrogate для эффективной замены классов, которые не могли быть запрограммированы для пользовательских, которые могли бы быть. IDataContractSurrogate не существует в PCL, а DataContractJsonSerializer, по-видимому, является логически сокращенной версией.Суррогатные типы для сериализации в C# Portable Class Library

Настоящий вопрос: Что такое переносной эквивалент IDataContractSurrogate?

Я до сих пор смотрел на:

[On (De) Сериализация] Атрибуты которые возвращают суррогатный класс, но не думаю, что это на самом деле, как эти атрибуты работают и, безусловно, не то, что они были предназначены для.

SerializationBinder, но это, кажется, не будет принят PCL совместимый DataContractJsonSerializer «Эта функция доступна только при использовании BinaryFormatter или NetDataContractSerializer».

DataContractResolver кажется лучшим вариантом, но он не включен нигде в настройках DataContractJsonSerializer.

JsonCreationConverter/[JsonConverter] из Json.NET, которые, кажется, как жизнеспособные варианты, но помешали бы мне обменивать форматы сериализации в будущих итерациях (т.е. JSON отлично подходит для отладки, но я мог бы переключиться на Binary позже, если это возможно).

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

Спасибо заранее,

ответ

0

Там не появляется, чтобы быть PCL версии этого, к сожалению. Однако .NET Standard является следующей формой PCL, и, как представляется .NET Standard 1.3 библиотеки, которая содержит ISerializationSurrogateProvider интерфейса:

public interface ISerializationSurrogateProvider 
{ 
    Type GetSurrogateType(Type type); 

    object GetObjectToSerialize(object obj, Type targetType); 

    object GetDeserializedObject(object obj, Type targetType); 
} 

Это найденное в System.Runtime.Serialization.Primitives пакете, который может быть установлен путем добавления System.Runtime.Serialization.Xml пакет для вашего проекта NuGet 3.4+. Этот пакет ссылается и включает в себя пакет Primitives в качестве зависимости.

Кроме того, как представляется, еще один «частный» пакет, System.Private.DataContractSerialization который содержит класс с двумя методами расширения для DataContractSerializer, что изменить то, что, как представляется, теперь внутреннее свойство для этого класса:

namespace System.Runtime.Serialization 
{ 
    public static class DataContractSerializerExtensions 
    { 
    public static ISerializationSurrogateProvider GetSerializationSurrogateProvider(this DataContractSerializer serializer) 
    { 
     return serializer.SerializationSurrogateProvider; 
    } 

    public static void SetSerializationSurrogateProvider(this DataContractSerializer serializer, ISerializationSurrogateProvider provider) 
    { 
     serializer.SerializationSurrogateProvider = provider; 
    } 
    } 
} 

Таким образом, несмотря на то, что в PCL-поддержке отсутствует поддержка этой функции, существует поддержка стандарта .NET Standard, и она должна только улучшаться.

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