XML (des) serialización cadena inválida inconsistente en c #?
En C # (.net 4.0 y 4.5 / vs2010 y vs12) cuando serializo un objeto que contiene una cadena que tiene un carácter ilegal usando XMLSerializer, no se produce ningún error. Sin embargo, cuando deserializo ese resultado, se produce un error de "carácter no válido".
// add to XML
Items items = new Items();
items.Item = "\v hello world"; // contains "illegal" character \v
// variables
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Items));
string tmpFile = Path.GetTempFileName();
// serialize
using (FileStream tmpFileStream = new FileStream(tmpFile, FileMode.Open, FileAccess.ReadWrite))
{
serializer.Serialize(tmpFileStream, items);
}
Console.WriteLine("Success! XML serialized in file " + tmpFile);
// deserialize
Items result = null;
using (FileStream plainTextFile = new FileStream(tmpFile, FileMode.Open, FileAccess.Read))
{
result = (Items)serializer.Deserialize(plainTextFile); //FAILS here
}
Console.WriteLine(result.Item);
"Elementos" es solo una clase pequeña generada automáticamente por xsd / c Items.xsd. Items.xsd no es más que un elemento raíz (Items) que contiene un hijo (Item):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
El error que se produce durante la deserialización es
Excepción no controlada: System.InvalidOperationException: hay un error en el documento XML (3, 12). ---> System.Xml.XmlException: '♂', el valor hexadecimal 0x0B, es un carácter no válido. Línea 3, posición 12.
El archivo XML serializado contiene en la línea 3 esto:
<Item> hello world</Item>
Sé \ v -> & # xB; es un carácter ilegal, pero ¿por qué XMLSerialize permite que se serialice (sin error)? Me parece inconsistente con .NET que me permite serializar algo sin problemas solo para descubrir que no puedo deserializarlo.
¿Existe una solución para que el XMLSerializer elimine los caracteres ilegales automáticamente antes de la serialización o puedo indicar a la deserialización que ignore los caracteres ilegales?
Actualmente lo resuelvo leyendo el contenido del archivo como una cadena, reemplazando "manualmente" a los caracteres ilegales y luego deserializarlo ... pero me parece que es un truco / trabajo feo.