visual una studio standard préstamo programa para net libros libreria hacer framework crear como clases clase biblioteca c# serialization datacontract serializable portable-class-library

una - hacer libreria en c#



Biblioteca de clases portátil: reemplazo recomendado para (3)

Para .Net 4.6 y posteriores, DataContract ya no está disponible para PCL. Necesita agregar el paquete Nuget System.Runtime.Serialization.Primitives disponible aquí: https://www.nuget.org/packages/System.Runtime.Serialization.Primitives/

Tenga en cuenta que para la serialización real probablemente también necesite una implementación como System.Runtime.Serialization.Json, System.Runtime.Serialization.Xml o un Newtonsoft.Json.

Estoy portando una biblioteca de clases .NET Framework C # a una Biblioteca de clases portátil. Un problema recurrente es cómo tratar las clases decoradas con el atributo [Serializable] , ya que este atributo no forma parte del subconjunto Biblioteca de clases portátil. La funcionalidad de serialización en el subconjunto Biblioteca de clases portátil parece estar cubierta por DataContractAttribute .

  • Para preservar la mayor funcionalidad posible en la Biblioteca de clases portátil, es suficiente reemplazar [Serializable] con el atributo [DataContract] (con la consecuencia de que todos los campos y propiedades sujetos a serialización deberían decorarse con [DataMember] como bien)?
  • ¿Qué (si acaso) no podré hacer con este enfoque que puedo hacer con [Serializable] aplicado?
  • ¿Hay un enfoque menos intrusivo?

Dado que se utilizan [DataContract] y [DataMember] , estoy considerando cambiar el código a lo largo de las siguientes líneas. ¿Hay algún defecto obvio con este enfoque? ¿Hay alguna manera de formular lo mismo menos detallado?

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


Una cosa que podría hacer para eliminar el desorden que provocan las directivas del preprocesador constante es llevarlo a una nueva clase SerializableAttribute y básicamente engañar al compilador.

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

Entonces solo continúa decorando tus clases con Serializable como de costumbre ...


Portable Class Libraries (PCL) ahora oficialmente obsoleto [16 de agosto de 2017]

Si comparte código entre diferentes implementaciones .NET hoy, probablemente conozca las Portable Class Libraries (PCL). Con el lanzamiento de .NET Standard 2.0, ahora estamos oficialmente desaprobando las PCL y debe mover sus proyectos a .NET Standard.

Fuente: anuncio de .NET Standard 2.0

Portable Class Library (PCL) ahora disponible en todas las plataformas [14 de octubre de 2013]

Antes del lanzamiento de hoy, había una restricción de licencia con los ensamblajes de referencia PCL, lo que significaba que solo podían usarse en Windows. Con el lanzamiento de hoy, anunciamos una nueva versión independiente de los ensamblajes de referencia PCL con una licencia que permite su uso en cualquier plataforma, incluidas las que no sean de Microsoft. Esto permite a los desarrolladores aún más flexibilidad y hacer grandes cosas con .NET.

Fuente: Portable Class Library (PCL) ahora disponible en todas las plataformas

Descargar: Conjuntos de referencia de biblioteca portátil de Microsoft .NET 4.6 RC

Solo para la referencia, el conjunto permitido de conjuntos es:

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 (desde Silverlight)

Por lo que sé, necesita marcar los campos con el atributo DataMember y agregar el atributo DataContract .

ACTUALIZAR

Sí.

Puede ver cómo se implementa la solución de biblioteca portátil de clases Json.NET . Puede encontrar la solución en Source / Src / Newtonsoft.Json.Portable cuando descargue el proyecto desde aquí Json.NET 4.5 Versión 10 (fuente + binario) .

Básicamente, están utilizando un enfoque con un proveedor de atributos personalizados

// no uso Serializable

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

// use un proveedor personalizado

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

Y si el proyecto es PORTABLE

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

donde la descripción de OptIn es:

/// <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,

Espero eso ayude.

ACTUALIZACIÓN 2

¿Estoy perdiendo alguna habilidad usando [DataContract] en lugar de [Serializable], o aún podré hacer todo lo que [Serializable] admite?

Puede hacer todo lo que admite Serializable, excepto el control sobre cómo se serializa el objeto fuera de establecer el nombre y el orden.

Usar DataContractSerializer tiene varios beneficios:

[DataMember] cualquier cosa decorada con un [DataMember] incluso si no es pública visible

no puede serializar nada a menos que específicamente lo diga ("opt-in")

puede definir el orden en el que los elementos se serializan utilizando el atributo [Order=] en [DataMember]

no requiere un constructor sin parámetros para la deserialización

es 10% más rápido que XmlSerializer.

Lea más aquí: XmlSerializer vs DataContractSerializer

También para la referencia:

DataContract admite la serialización de los siguientes tipos de tipos en el modo predeterminado: tipos incorporados CLR

Conjunto de bytes, DateTime, TimeSpan, GUID, Uri, XmlQualifiedName, XmlElement y matriz XmlNode

Enums

Tipos marcados con el atributo DataContract o CollectionDataContract

Tipos que implementan IXmlSerializable

Arrays y clases de colección que incluyen List, Dictionary y Hashtable

Los tipos marcados con el atributo Serializable, incluidos los que implementan ISerializable

Tipos con ninguno de los atributos anteriores (POCO) pero con un constructor predeterminado