tipo serializacion reflejar net error deserializacion .net windows uwp

.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.