Вопрос по serializable, datacontract, portable-class-library, serialization, c# – Переносимая библиотека классов: рекомендуемая замена для [Serializable]

43

Я портирую библиотеку классов .NET Framework C # на Portable Class Library. Одна повторяющаяся проблема состоит в том, как бороться с классами, украшенными[Serializable] атрибут, так как этот атрибут не является частью подмножества Portable Class Library. Функциональность сериализации в подмножестве Portable Class Library вместо этого, кажется, покрытаDataContractAttribute.

Чтобы сохранить как можно больше функциональных возможностей в Portable Class Library, достаточно ли заменить[Serializable] с[DataContract] атрибут (подразумевается, что все поля и свойства, подлежащие сериализации, должны быть украшены[DataMember] также)?Что (если что) я будуне быть в состоянии сделать с этим подходом, который яМожно делать с[Serializable] применяется?Есть ли менее навязчивый подход?

При условии[DataContract] а также[DataMember] используются, я собираюсь изменить код в следующих направлениях. Есть ли очевидные недостатки этого подхода? Есть ли способ сформулировать то же самое менее многословно?

#if PORTABLE
    [DataContract]
#else
    [Serializable]
#endif
    public class SerializableClass : SerializableBaseClass
    {
       ...
#if !PORTABLE
        protected SerializableClass(SerializationInfo info, StreamingContext context)
             : base(info, context)
        {
        }
#endif
        ...
#if PORTABLE
        [DataMember]
#endif
        private Type1 _serializableField;

#if PORTABLE
        [DataMember]
#endif
        private Type2 SerializableProperty { get; set; }

        ...
    }

Ваш Ответ

3   ответа
2

одимо добавить пакет Nuget System.Runtime.Serialization.Primitives, доступный здесь:https://www.nuget.org/packages/System.Runtime.Serialization.Primitives/

Примечание для фактической сериализации выВозможно, потребуется также реализация, такая как System.Runtime.Serialization.Json, System.Runtime.Serialization.Xml или Newtonsoft.Json.

Я не'не знаю, что ты можешь сделать это! Сэкономил мне кучу времени и сделал мою жизнь проще! Спасибо! Jay Jacobs
10

которую вы могли бы сделать, чтобы устранить беспорядок, который вызывают постоянные директивы препроцессора, - это отодвинуть это к одному новомуSerializableAttribute класс и в основном обмануть компилятор.

#if PORTABLE
namespace System
{
   public class SerializableAttribute : Attribute
   {
       //this does nothing
   }  
}
#endif

Тогда просто продолжайте украшать ваши классыSerializable как обычно...

Это нет работа - есть исключение типаТип *** не помечен как Сериализуемый. " Sarge Borsch
Работал на меня. Это'важноSerializableAttribute Быть вSystem Пространство имен Artiom
Спасибо! Однако, с этим решением функциональность серийности не учитывается, верно? Anders Gustafsson
Использование пакета Shim NuGet устраняет первую проблему, но серийная сериализация неиграть хорошо с бэкэндом Azure .NET (не относящиеся к типу clrполучить сериализацию; просто ноль прибывает на сторону AMS). Похоже, ям после DataContractSerializer Barton
Хм ... Согласно этому комментариюforums.xamarin.com/discussion/comment/71885/#Comment_71885 в посте, который связал меня здесь, это должно работать, но я также получаюне отмечено исключение. Barton
43

Portable Class Libraries (PCL) теперь официально устарели [16 августа 2017]

Если ты'разделяя код между различными реализациями .NET сегодня, вывероятно, мы знаем о переносимых библиотеках классов (PCL). С выпуском .NET Standard 2.0 мыСейчас вы официально отказываетесь от PCL, и вам следует перевести свои проекты на .NET Standard.

Источник: Объявление о .NET Standard 2.0

Portable Class Library (PCL) теперь доступна на всех платформах [14 октября 2013]

До сегодняшнего дняВ выпуске было ограничение лицензии для эталонных сборок PCL, что означало, что их можно использовать только в Windows. С сегодняшним днемС выпуском мы объявляем о новом отдельном выпуске эталонных сборок PCL с лицензией, которая позволяетиспользуется на любой платформе - в том числе не от Microsoft. Это дает разработчикам еще большую гибкость и позволяет делать отличные вещи с помощью .NET.

Источник: Portable Class Library (PCL) теперь доступна на всех платформах

Скачать: Справочные сборки портативных библиотек Microsoft .NET 4.6 RC

Просто для справки допустимый набор сборок:

mscorlib.dll

System.dll

System.Core.dll

system.Xml.dll

System.ComponentModel.Composition.dll (MEF)

System.Net.dll

System.Runtime.Serialization.dll

System.ServiceModel.dll

System.Xml.Serialization.dll

System.Windows.dll (из Silverlight)

Насколько я знаю, вы должны пометить поляDataMember атрибут и добавитьDataContract приписывать.

ОБНОВИТЬ

Да.

Вы можете посмотреть, какJson.NET реализовано решение для переносимой библиотеки классов Вы можете найти решение вИсточник \ Src \ Newtonsoft.Json.Portable когда вы скачиваете проект отсюдаJson.NET 4.5 Release 10 (исходный + двоичный).

В основном они используют подход с поставщиком пользовательских атрибутов

// Дон»использовать Serializable

#if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE)
  [Serializable]
#endif

// использовать собственный провайдер

#if NETFX_CORE || PORTABLE
using ICustomAttributeProvider = Newtonsoft.Json.Utilities.CustomAttributeProvider;
#endif 

И если проектПОРТАТИВНЫЙ

#if !PocketPC && !NET20
      DataContractAttribute dataContractAttribute = GetDataContractAttribute(objectType);
      if (dataContractAttribute != null)
        return MemberSerialization.OptIn;
#endif

гдеВыбрать в описание есть:

 /// <summary>
    /// Only members must be marked with <see cref="JsonPropertyAttribute"> or <see cref="DataMemberAttribute"> are serialized.
    /// This member serialization mode can also be set by marking the class with <see cref="DataContractAttribute">.
    /// </see></see></see></summary>
    OptIn,

Надеюсь, поможет.

ОБНОВЛЕНИЕ 2

Я теряю какие-либо способности, используя [DataContract] вместо [Serializable], или я все еще смогу делать все, что поддерживает [Serializable]?

Вы можете сделать все, чтоСериализуемый поддерживает, кроме контроля над тем, как объект сериализуется вне установки имени и порядка.

С помощьюDataContractSerializer имеет несколько преимуществ:

сериализовать все, что украшено[DataMember] даже если этоне публично видно

Можно't сериализовать что-либо, если вы специально не скажете это ("выбрать в")

Вы можете определить порядок, в котором элементы сериализуются, используя[Order=] атрибут на[DataMember]

Безразлично»для десериализации требуется конструктор без параметров

на 10% быстрее, чем XmlSerializer.

Узнайте больше здесь:XmlSerializer против DataContractSerializer

Также для справки:

DataContract поддерживает сериализацию следующих типов в режиме по умолчанию: встроенные типы CLR

Массив байтов, DateTime, TimeSpan, GUID, Uri, XmlQualifiedName, XmlElement и XmlNode.

Перечисления

Типы, отмеченные с помощью атрибута DataContract или CollectionDataContract

Типы, которые реализуют IXmlSerializable

Классы Arrays и Collection, включая List, Dictionary и Hashtable

Типы, помеченные атрибутом Serializable, включая те, которые реализуют ISerializable

Типы без указанных выше атрибутов (POCO), но с конструктором по умолчанию

Смотрите обновленный ответ. Matija Grcic
Спасибо, очень информативно! Anders Gustafsson
Смотрите обновление 2. Matija Grcic
Моя главная проблема заключается в том, будет ли декорация с помощью [DataContract] и [DataMember] быть достаточной заменой для [Serializable]? Anders Gustafsson
Большое спасибо за информативное обновление, яПосмотрим поближе на JSON. Я теряю какие-либо способности, используя [DataContract] вместо [Serializable], или я все еще смогу делать все, что поддерживает [Serializable]? Anders Gustafsson

Похожие вопросы