Serialización de caracteres no imprimibles

El siguiente código;

var c = (char) 1;

var serializer = new XmlSerializer(typeof (string));

var writer = new StringWriter();
serializer.Serialize(writer, c.ToString()); 
var serialized = writer.ToString();

var dc = serializer.Deserialize(new StringReader(serialized));

Lanza esta excepción en .NET 4.

Excepción de operación no válida: hay un error en el documento XML (2, 12). '', valor hexadecimal 0x01, es un carácter no válido. Línea 2, posición 12

¿Estoy haciendo algo mal? ¿O hay una solución razonable?

Muchas gracias!

preguntado el 16 de mayo de 11 a las 16:05

2 Respuestas

Hay una solución como se explica aquí - puedes usar XmlReaderSettings.CheckCharacters opción para ignorar la validación de caracteres:

XmlReader xr = XmlReader.Create(new StringReader(serialized),
    new XmlReaderSettings { CheckCharacters = false });
var dc = (string)serializer.Deserialize(xr);

contestado el 23 de mayo de 17 a las 15:05

+1 porque no lo sabía, pero creo que vale la pena enfatizar que terminará con XML no válido. Si algo más en su canalización de datos se basa en XML válido, se romperá. - Jon Skeet

Está intentando serializar caracteres que no se pueden representar en XML. Desafortunadamente, rompen la serialización XML. No conozco ninguna solución alternativa para esto que no sea escribir su propio código de escape.

Por otro lado, los usos reales de dichos caracteres (caracteres ASCII antes del espacio, que no sean tabulación, retorno de carro y salto de línea IIRC) son relativamente raros; es posible que encuentre que está bien solo para eliminarlos. Las alternativas son crear su propio escape o codificar toda la cadena como binario y base64 como resultado. Escapar tomará mucho menos espacio que el enfoque de recodificación :)

contestado el 16 de mayo de 11 a las 20:05

Sí, si estás en el punto en el que estos caracteres son importantes, es hora de dejar de tratarlos como texto. Es binario. - R. Martinho Fernandes

Gracias @JonSkeet, en caso de que sea de interés, estoy tratando de serializar un objeto que contiene un estándar Mensaje FIX en un campo de cadena dentro de él. Usan SOH / (char) 1 como delimitador. Aprecio su punto de que este XML no es válido, pero este es solo un pequeño proyecto paralelo, por lo que seré pragmático y usaré el enfoque a continuación. ¡Gracias! - Vista de la ciudad

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.