2009-08-25 6 views
0

J'utilise le code suivant pour serialise un objet:encodage nomenclature pour le stockage de base de données

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

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

Malheureusement, quand je l'enregistrer dans une base de données (LINQ to SQL), puis interroger la base de données, la chaîne semble commencer par un point d'interrogation:

?<z:anyType xmlns... 

Comment puis-je me débarrasser de cela? Lorsque je tente de désérialiser en utilisant les éléments suivants:

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

Je reçois l'exception suivante:

« Erreur dans la ligne 1 la position 1. Expecting élément 'anyType' de l'espace de noms 'http://schemas.microsoft.com/2003/10/Serialization/' .. rencontrés 'texte' avec le nom '', espace de noms ''. "

les implémentations de l'utilisation messageSerializer le DataContractSerializer comme suit:

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(); 
    } 
} 

Répondre

2

Malheureusement, quand je l'enregistrer dans une base de données (LINQ to SQL), puis interroger la base de données, la chaîne semble commencer par un point d'interrogation:

? < z: anyType xmlns ...

Votre base de données n'est pas configurée pour prendre en charge les caractères Unicode. Vous écrivez une chaîne incluant une nomenclature, la base de données ne peut pas la stocker et la transforme en '?'. Puis quand vous revenez lire la chaîne en XML, le '?' est le contenu du texte en dehors de l'élément racine et vous obtenez une erreur. (Vous ne pouvez avoir qu'un texte d'espaces en dehors de l'élément racine.)

Pourquoi la nomenclature arrive-t-elle? Parce que Microsoft aime laisser tomber les nomenclatures partout, même quand ils ne sont pas nécessaires (et ils ne le sont jamais, avec UTF-8). La solution est de faire votre propre instance de UTF8Encoding au lieu d'utiliser le haut-Encoding.UTF8, et lui dire que vous ne voulez pas ses stupides BOM:

Encoding utf8onlynotasridiculouslysucky= new UTF8Encoding(false); 

Cependant, ce n'est vraiment masquer la vraie question , qui est la configuration de la base de données.

+0

Bon, quelle configuration dois-je changer dans la base de données? –

+0

Oh, bonne réponse, btw. Je pensais que je devenais un peu fâché et je ne suis pas content de couper les points d'interrogation et les choses. –

+0

Aucune idée ... quel est le serveur de base de données? comment vous connectez-vous? Qu'y a-t-il dans le schéma? – bobince

Questions connexes