2009-08-25 7 views
0

ich den folgenden Code bin mit einem Objekt serialise:BOM-Codierung für die Speicherung in Datenbanken

public static string Serialise(IMessageSerializer messageSerializer, DelayMessage message) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     messageSerializer.Serialize(new[] { message }, stream); 

     return Encoding.UTF8.GetString(stream.ToArray()); 
    } 
} 

Leider, wenn ich es in eine Datenbank (mit LINQ to SQL) speichern, abfragen, dann die Datenbank, die Zeichenfolge scheint mit einem Fragezeichen zu beginnen:

?<z:anyType xmlns... 

Wie werde ich das los? Wenn ich versuche, de-serialise mit dem folgenden:

public static DelayMessage Deserialise(IMessageSerializer messageSerializer, string data) 
{ 
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(data))) 
    { 
     return (DelayMessage)messageSerializer.Deserialize(stream)[0]; 
    } 
} 

Ich erhalte die folgende Ausnahme:

„Fehler in Zeile 1, Position 1. Erwartet Element 'anyType' von Namespace 'http://schemas.microsoft.com/2003/10/Serialization/' .. Begegnet 'Text' mit dem Namen '', Namespace '. "

die Implementierungen der messageSerializer Verwendung die DataContractSerializer wie folgt:

public void Serialize(IMessage[] messages, Stream stream) 
{ 
    var xws = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment }; 
    using (var xmlWriter = XmlWriter.Create(stream, xws)) 
    { 
     var dcs = new DataContractSerializer(typeof(IMessage), knownTypes); 
     foreach (var message in messages) 
     { 
      dcs.WriteObject(xmlWriter, message); 
     } 
    } 
} 

public IMessage[] Deserialize(Stream stream) 
{ 
    var xrs = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; 
    using (var xmlReader = XmlReader.Create(stream, xrs)) 
    { 
     var dcs = new DataContractSerializer(typeof(IMessage), knownTypes); 
     var messages = new List<IMessage>(); 
     while (false == xmlReader.EOF) 
     { 
      var message = (IMessage)dcs.ReadObject(xmlReader); 
      messages.Add(message); 
     } 
     return messages.ToArray(); 
    } 
} 

Antwort

2

Leider, wenn ich es in eine Datenbank (mit LINQ to SQL) speichern, dann die Datenbank abfragen, die Zeichenfolge erscheint mit einem Fragezeichen zu starten:

? < z: anyType xmlns ...

Ihre Datenbank ist nicht für die Unterstützung von Unicode-Zeichen eingerichtet. Sie schreiben eine Zeichenkette mit einer Stückliste, die Datenbank kann sie nicht speichern, also wird sie in ein '?' Zerlegt. Wenn Sie dann zurückkommen, um die Zeichenfolge als XML zu lesen, wird das '?' ist Textinhalt außerhalb des Wurzelelements und Sie erhalten einen Fehler. (Sie können nur Leerzeichen außerhalb des Stammelements eingeben.)

Warum kommt die Stückliste? Weil Microsoft Liebe fallen BOMs überall auf dem Platz, auch wenn sie nicht benötigt werden (und sie sind nie, mit UTF-8). Die Lösung ist Ihre eigene Instanz von UTF8Encoding statt mit dem eingebauten in Encoding.UTF8 zu machen, und sagen, dass es Sie nicht seine dummen Stücklisten wollen:

Encoding utf8onlynotasridiculouslysucky= new UTF8Encoding(false); 

Dies ist jedoch nur dann wirklich das eigentliche Problem maskieren , das ist die Datenbankkonfiguration.

+0

Okay, also welche Konfiguration sollte ich in der Datenbank ändern? –

+0

Oh, gute Antwort, übrigens. Ich hatte gedacht, dass ich ein bisschen verrückt werde und ich bin nicht glücklich damit, nur Fragezeichen und Dinge zu schneiden. –

+0

Keine Ahnung ... Was ist der Datenbankserver? Wie verbinden Sie sich damit? Was ist im Schema? – bobince

Verwandte Themen