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