Ungültige XML- (De-) Serialisierungszeichenfolge in c # inkonsistent?
Wenn ich in C # (.net 4.0 und 4.5 / vs2010 und vs12) ein Objekt serialisiere, das eine Zeichenfolge mit einem unzulässigen Zeichen enthält, wird mit XMLSerializer kein Fehler ausgegeben. Wenn ich dieses Ergebnis deserialisiere, wird jedoch ein Fehler "ungültiges Zeichen" ausgegeben.
// 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);
"Items" ist nur eine kleine Klasse, die von xsd / c Items.xsd automatisch generiert wird. Items.xsd ist nichts anderes als ein Stammelement (Items), das ein untergeordnetes Element (Item) enthält:
<?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>
Der Fehler, der während der Deserialisierung ausgelöst wird, ist
Nicht behandelte Ausnahme: System.InvalidOperationException: Im XML-Dokument (3, 12) ist ein Fehler aufgetreten. ---> System.Xml.XmlException: '♂', Hexadezimalwert 0x0B, ist ein ungültiges Zeichen. Zeile 3, Position 12.
Die serialisierte XML-Datei enthält in Zeile 3 Folgendes:
<Item> hello world</Item>
Ich weiß, dass \ v -> & # xB; ist ein unzulässiges Zeichen, aber warum ermöglicht XMLSerialize die Serialisierung (ohne Fehler)? Ich finde es inkonsistent mit .NET, dass es mir erlaubt, etwas ohne Probleme zu serialisieren, nur um herauszufinden, dass ich es nicht deserialisieren kann.
Gibt es eine Lösung dafür, dass der XMLSerializer die unzulässigen Zeichen entweder automatisch vor der Serialisierung entfernt oder ich die Deserialisierung anweisen kann, die unzulässigen Zeichen zu ignorieren?
Momentan löse ich das Problem, indem ich den Inhalt der Datei als String lese, die unzulässigen Zeichen "manuell" ersetze und als nächstes deserialisiere ... aber ich finde, dass dies ein hässlicher Hack / Workaround ist.