0

我正在使用以下代码来序列化一个对象:

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

1 回答 1

3

不幸的是,当我将它保存到数据库(使用 LINQ to SQL)然后查询数据库时,字符串似乎以问号开头:

?<z:anyType xmlns...

您的数据库未设置为支持 Unicode 字符。您在其中编写了一个包含 BOM 的字符串,数据库无法将其存储,因此将其更改为“?”。然后,当您返回以 XML 格式读取字符串时,'?' 是根元素之外的文本内容,您会收到错误消息。(您只能在根元素之外有空白文本。)

为什么 BOM 会到达那里?因为微软喜欢到处丢弃 BOM,即使在不需要它们的时候(它们从来都不需要,使用 UTF-8)。解决方案是制作您自己的 UTF8Encoding 实例,而不是使用内置的 Encoding.UTF8,并告诉它您不想要其愚蠢的 BOM:

Encoding utf8onlynotasridiculouslysucky= new UTF8Encoding(false);

但是,这只是掩盖了真正的问题,即数据库配置。

于 2009-08-25T13:16:04.097 回答