43 votes

Bibliothèque de classes portable: remplacement recommandé pour [Sérialisable]

Je suis le portage d'une .NET Framework, C# bibliothèque de classe à une Bibliothèque de classes Portable. Un problème récurrent est la façon de traiter avec des classes décoré avec de la [Serializable] d'attribut, puisque cet attribut n'est pas une partie de la Bibliothèque de classes Portable sous-ensemble. La sérialisation de la fonctionnalité dans la Bibliothèque de classes Portable sous-ensemble au lieu de cela semble être couverts par DataContractAttribute.

  • Afin de préserver autant de fonctionnalités que possible dans la Bibliothèque de classes Portable, est-il suffisant pour remplacer [Serializable] avec l' [DataContract] d'attribut (avec l'implication de tous les champs et les propriétés assujetties à la sérialisation aurait besoin d'être décorés avec de la [DataMember] ainsi)?
  • Ce que (le cas échéant) vais-je pas être en mesure de faire avec cette approche que je peut faire avec [Serializable] appliquée?
  • Est-il moins intrusive approche?

Étant donné qu' [DataContract] et [DataMember] sont utilisés, j'envisage de modifier le code le long des lignes suivantes. Existe-il des défauts évidents avec cette approche? Est-il possible de formuler la même chose moins verbeux?

#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; }

        ...
    }

43voto

Matija Grcic Points 3905

Bibliothèque de classes Portable (PCL) est maintenant disponible sur toutes les plateformes [14 Oct 2013]

Avant la publication d'aujourd'hui, il y a une restriction de licence avec le PCL référence assemblées qui signifie qu'ils ne pourraient être utilisés que sur Windows. Avec la publication d'aujourd'hui, nous annonçons une nouvelle version monoposte de l' PCL référence assemblées avec une licence qui lui permet d'être utilisé sur n'importe quelle plateforme, y compris les non-Microsoft chers. Cela permet aux développeurs encore plus de flexibilité et de faire de grandes choses avec .NET.

Source: Bibliothèque de classes Portable (PCL) est maintenant disponible sur toutes les plateformes

Télécharger: Microsoft .NET Portable de Référence de la Bibliothèque Assemblées 4.6 RC

Juste pour la référence, le permis d'assemblées sont:

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)

Comme je sais que vous avez besoin de marquer les champs avec DataMember attribut, et ajouter le DataContract attribut.

Mise à JOUR

Oui.

Vous pouvez regarder comment Json.NET bibliothèque de classes portable solution est mise en œuvre. Vous pouvez trouver la solution dans la Source\Src\Newtonsoft.Json.Portable lorsque vous téléchargez le projet à partir d'ici Json.NET 4.5-Release 10 (source + binaire).

Essentiellement, ils sont en utilisant une approche avec un attribut personnalisé fournisseur

//n'utilisez pas Sérialisable

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

//utilisation d'un fournisseur personnalisé

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

Et si le projet est de PORTABLE

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

OptIn description est:

 /// <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"/>.
    /// </summary>
    OptIn,

Espérons que cela aide.

Mise à JOUR 2

Suis-je perdre des capacités à l'aide de [DataContract] au lieu de [Serializable], ou vais-je encore être en mesure de faire tout ce que [Serializable] prend en charge?

Vous pouvez faire tout ce que Serializable prend en charge à l'exception de contrôle sur la façon dont l'objet est sérialisé en dehors de la définition du nom et de l'ordre.

À l'aide de DataContractSerializer a plusieurs avantages:

sérialiser rien décorées avec un [DataMember] , même si elle n'est pas visible du public

ne peut pas sérialiser rien à moins que vous dire précisément ce qu'il ("opt-in")

vous pouvez définir l'ordre dans lequel les éléments sont en série à l'aide de l' [Order=] attribut sur l' [DataMember]

ne nécessite pas un constructeur sans paramètre pour la désérialisation

est 10% plus rapide que le XmlSerializer.

Lire la suite ici: XmlSerializer vs DataContractSerializer

Aussi pour la référence:

DataContract soutient la sérialisation des types suivants de types dans le mode par défaut: CLR types intégrés

Tableau d'octets, DateTime, TimeSpan, GUID, Uri, XmlQualifiedName, XmlElement et XmlNode tableau

Les Enums

Types marqué avec DataContract ou CollectionDataContract attribut

Les Types qui implémentent IXmlSerializable

Les tableaux et les classes de Collection, y compris la Liste, et le Dictionnaire de Hashtable

Types marquée avec l'attribut Serializable y compris ceux qui mettre en œuvre ISerializable

Types avec aucune des caractéristiques ci-dessus (POCO), mais avec une valeur par défaut constructeur

10voto

Steve Danner Points 11604

Une chose que vous pouvez faire pour éliminer l’encombrement généré par les directives de préprocesseur constantes est de le pousser vers une nouvelle classe SerializableAttribute et de tromper le compilateur.

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

Puis continuez simplement à décorer vos cours avec Serializable comme d'habitude ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X