2009-08-25 65 views
0

我使用下面的代碼序列化對象:數據庫存儲BOM編碼

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

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

不幸的是,當我把它保存到數據庫中(使用LINQ to SQL),然後查詢數據庫,字符串似乎開始有一個問號:

?<z:anyType xmlns... 

我該如何擺脫?當我嘗試使用,以取消序列如下:

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

我得到以下異常:在第1行位置1

「錯誤的命名空間 ‘http://schemas.microsoft.com/2003/10/Serialization/’期待 元素‘anyType的’ .. 遇到名稱 '', 命名空間 '' '文本'。「

messageSerializer使用的實現在DataContractSerializer如下:

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

回答

2

不幸的是,當我把它保存到數據庫中(使用LINQ to SQL),然後查詢數據庫,該字符串似乎開始一個問號:

? < Z:anyType的XMLNS ...

您的數據庫未設置爲支持Unicode字符。你寫的,包括它的BOM的字符串,數據庫不能將其存放軋液它變成一個「?」。然後當你回來讀取字符串爲XML時,'?'是根元素之外的文本內容,您會收到錯誤消息。 (你只能有根元素之外的空白文本。)

爲什麼BOM到達那裏?由於微軟下降的BOM遍佈的地方,不是在需要的,即使他們(和他們從來都懷着UTF-8)。解決的辦法是使自己的UTF8Encoding的實例,而不是使用內置的Encoding.UTF8,並告訴它你不希望它的愚蠢的BOM:

Encoding utf8onlynotasridiculouslysucky= new UTF8Encoding(false); 

然而,這是唯一真正掩蓋了真正的問題,這是數據庫配置。

+0

好了,所以我應該改變數據庫中什麼配置? – 2009-08-25 14:40:30

+0

哦,很好的答案,順便說一句。我曾以爲我有點生氣,只是修剪問號和事物而不滿意。 – 2009-08-25 14:41:02

+0

不知道......數據庫服務器是什麼?你怎麼連接到它?模式中有什麼? – bobince 2009-08-25 14:52:45