代码之家  ›  专栏  ›  技术社区  ›  Neil Barnwell

数据库存储的物料清单编码

  •  0
  • Neil Barnwell  · 技术社区  · 15 年前

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

    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出错。期望 命名空间中的元素“anyType” ’ http://schemas.microsoft.com/2003/10/Serialization/ … 遇到名为“”的“text”, 命名空间的''.

    的实现 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();
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   bobince    15 年前

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

    ?<Z:任何类型的xmlns…

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

    为什么物料清单会到达那里?因为微软 即使在不需要的时候,也可以将bom放在各处(而使用utf-8,它们从来就不是)。解决方案是创建自己的utf8 encoding实例,而不是使用内置的encoding.utf8,并告诉它您不希望它的愚蠢的bom:

    Encoding utf8onlynotasridiculouslysucky= new UTF8Encoding(false);
    

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