.net - serializacion - ¿Se ha eliminado el atributo System.Serializable en las aplicaciones UWP de Windows 10?
error al reflejar el tipo vb net (2)
Al intentar portar una biblioteca de código abierto (Aforge.net) a UWP, descubrí que el atributo System.Serializable no parece existir. Las referencias para UWP funcionan un poco diferente y todavía estoy tratando de entender los cambios, así que espero que me esté perdiendo algo simple.
Mi pregunta es, ¿alguien puede confirmar si el atributo System.Serializable funciona / debería funcionar en una aplicación UWP? Intenté buscar en MSDN y otras fuentes de Google, pero no puedo encontrar ninguna evidencia de una manera u otra.
Cualquier ayuda es muy apreciada.
Actualizar
Parece que debo usar los atributos DataContract / DataMember en lugar de Serializable como se mencionó aquí para las bibliotecas portátiles: Biblioteca de clases portátil: reemplazo recomendado para [Serializable]
¿Pensamientos?
Necesita usar los siguientes atributos:
Marque la clase con
[DataContract]
y marcar propiedades con
[DataMember]
o
[IgnoreDataMember]
Por ejemplo:
[DataContract]
public class Foo
{
[DataMember]
public string Bar { get; set; }
[IgnoreDataMember]
public string FizzBuzz { get; set; }
}
Como el código anterior de Lance McCarthy:
[DataContract]
public class Foo
{
[DataMember]
public string SomeText { get; set; }
// ....
[IgnoreDataMember]
public string FizzBuzz { get; set; }
}
Además, puede usar mi propia extensión (¡cambie MemoryStream a FileStream si necesita guardarlo en un archivo en lugar de en una cadena):
public static class Extensions
{
public static string Serialize<T>(this T obj)
{
var ms = new MemoryStream();
// Write an object to the Stream and leave it opened
using (var writer = XmlDictionaryWriter.CreateTextWriter(ms, Encoding.UTF8, ownsStream: false))
{
var ser = new DataContractSerializer(typeof(T));
ser.WriteObject(writer, obj);
}
// Read serialized string from Stream and close it
using (var reader = new StreamReader(ms, Encoding.UTF8))
{
ms.Position = 0;
return reader.ReadToEnd();
}
}
public static T Deserialize<T>(this string xml)
{
var ms = new MemoryStream();
// Write xml content to the Stream and leave it opened
using (var writer = new StreamWriter(ms, Encoding.UTF8, 512, leaveOpen: true))
{
writer.Write(xml);
writer.Flush();
ms.Position = 0;
}
// Read Stream to the Serializer and Deserialize and close it
using (var reader = XmlDictionaryReader.CreateTextReader(ms, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null))
{
var ser = new DataContractSerializer(typeof(T));
return (T)ser.ReadObject(reader);
}
}
}
y luego solo usa esas extensiones:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestSerializer()
{
var obj = new Foo()
{
SomeText = "Sample String",
SomeNumber = 135,
SomeDate = DateTime.Now,
SomeBool = true,
};
// Try to serialize to string
string xml = obj.Serialize();
// Try to deserialize from string
var newObj = xml.Deserialize<Foo>();
Assert.AreEqual(obj.SomeText, newObj.SomeText);
Assert.AreEqual(obj.SomeNumber, newObj.SomeNumber);
Assert.AreEqual(obj.SomeDate, newObj.SomeDate);
Assert.AreEqual(obj.SomeBool, newObj.SomeBool);
}
}
Buena suerte compañero.