Tengo las siguientes funciones: 2DataContractSerializer para serializar, pero no puede deserializar espalda
public static string Serialize(object obj)
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
MemoryStream memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, obj);
return Encoding.UTF8.GetString(memoryStream.GetBuffer());
}
public static object Deserialize(string xml, Type toType)
{
MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
// memoryStream.Position = 0L;
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
DataContractSerializer dataContractSerializer = new DataContractSerializer(toType);
return dataContractSerializer.ReadObject(reader);
}
El primero parece serializar un objeto a una cadena XML bien. El XML parece válido, no hay etiquetas rotas, no hay espacios en blanco al principio o al final, etc. Ahora la segunda función no quiere deserializar mi cadena xml de vuelta al objeto. En la última línea me sale:
Se ha producido un error al deserializar objeto de tipo [MI TIPO DE OBJETO AQUÍ]. Los datos en el nivel raíz no son válidos. Línea 1, posición 1.
¿Qué estoy haciendo mal? Traté de volver a escribir la función Deserializar varias veces, y siempre parece ser el mismo tipo de error. ¡Gracias!
Ah, y así es como llamo a la 2 funciones:
SomeObject so = new SomeObject();
string temp = SerializationManager.Serialize(so);
so = (SomeObject)SerializationManager.Deserialize(temp, typeof(SomeObject));
Para Deserialize, podría ser más eficiente reemplazar GetBytes/Write con "using (StreamWriter writer = new StreamWriter (transmisión, codificación) {writer.Write (xml); ...} "para evitar el búfer adicional [] buffer – crokusek
Esto es increíble, y aún así increíblemente útil. Lo más importante, esto es correcto. – Feign
He usado estos métodos también, pero tengo un pequeño problema cuando serialize-deserialize clases derivadas de una clase base. Tuve que modificar el método serialize solo un poco ([link] (https://stackoverflow.com/a/45443874/3785903)) para proporcionar el tipo de clase base. –