XMLSerializer-UTF-8与UTF-16代码有关的问题

时间:2018-08-28 05:03:32

标签: c# xml utf-8

我正在尝试将一个简单的对象(5个字符串属性)序列化为XML,以保存到DB Image字段。然后我需要在程序后面将它反序列化为字符串。
但是,我遇到了一些错误-由保存XML导致的,以为它位于UTF-16中,但是-当我从数据库将其加载回字符串中时-它认为它是UTF 8字符串。

我得到的错误是

  • InnerException {“没有Unicode字节顺序标记。无法切换到Unicode。”} System.Exception {System.Xml.XmlException} -消息“ XML文档(0,0)中存在错误。”字符串

这是由于我将字符串保存到数据库或从数据库加载字符串的两种不同方式而发生的吗?保存时,我正在使用StringBuilder-但是从数据库中加载时,我仅使用了String。

有什么想法吗?

序列化并保存到数据库

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea name="invite_email" id="invite_email" value="" class="autogrow" placeholder="Email Address" style="resize:none;overflow:hidden;-ms-overflow-style: none;min-height: 44px;border: 1px solid #e3e3e3;height: 44px; background: #fff;border-radius: 4px;    padding: 6px 12px !important;font-size: 14px !important; line-height: 2; width: 100%; margin: 0;"></textarea>

从数据库加载并反序列化

        // Now Save the OBject XML to the Query Tables
        var serializer = new XmlSerializer(ExportConfig.GetType());
        StringBuilder StringResult = new StringBuilder();
        using (var writer = XmlWriter.Create(StringResult))
        {
           serializer.Serialize(writer, ExportConfig);
        }
        //MessageBox.Show("XML :  " + StringResult);
        // Now Save to the Query

    try
    {
        string UpdateSQL = "Update ZQryRpt "
                     + "  Set ExportConfig = " + TAGlobal.QuotedStr(StringResult.ToString())
                     + "  where QryId = " + TAGlobal.QuotedStr(((DataRowView)bindingSource_zQryRpt.Current).Row["QryID"].ToString())
                     ;
        ExecNonSelectSQL(UpdateSQL, uniConnection_Config);
    }
    catch (Exception Error)
    {
        MessageBox.Show("Error Setting ExportConfig: " + Error.Message);
    }

2 个答案:

答案 0 :(得分:0)

John-非常感谢您的评论!它使我能够完成代码并找到解决方案。

您已经注意到-解决方案是使用流读取器-但我无法读取第一行,因为我的字符串中只有一个“行”。但是,我可以使用该行

            using (StreamReader sr = new StreamReader(stream, false))

这允许我读取流,而忽略设置为false的“字节顺序标记检测”。

    string XMLStored = MainFormRef.GetExportConfigForCurrentQuery();
    if (XMLStored.Length > 0)
    {
        IIDExportObject ExportConfig = new IIDExportObject();
        try
        {
            var serializer = new XmlSerializer(ExportConfig.GetType());
            // Now we need to build a Stream from the String to use in the XMLReader
            byte[] byteArray = Encoding.UTF8.GetBytes(XMLStored);
            MemoryStream stream = new MemoryStream(byteArray);
            // Now we need to use a StreamReader to get around UTF8 vs UTF16 issues
            //   A little cumbersome - but it works
            using (StreamReader sr = new StreamReader(stream, false))
            {
                using (var reader = XmlReader.Create(sr))
                {
                    ExportConfig = (IIDExportObject)serializer.Deserialize(reader);
                }
            }
        }
        catch
        {

        }

我不确定这是否是最好的解决方案-但这可以。我很想知道是否还有其他人可以更好地应对这一问题。

答案 1 :(得分:0)

多亏了G Bradley,我接受了他的回答,并对其进行了概括,以使其易于调用。

    public static string SerializeToXmlString<T>(T objectToSerialize)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = false;
        settings.Encoding = Encoding.UTF8;
        StringBuilder builder = new StringBuilder();

        using (XmlWriter writer = XmlWriter.Create(builder, settings))
        {
            serializer.Serialize(writer, objectToSerialize);
        }

        return builder.ToString();
    }

    public static T DeserializeFromXmlString<T>(string xmlString)
    {
        if (string.IsNullOrWhiteSpace(xmlString))
            return default;

        var serializer = new XmlSerializer(typeof(T));
        byte[] byteArray = Encoding.UTF8.GetBytes(xmlString);
        MemoryStream stream = new MemoryStream(byteArray);
        using (StreamReader sr = new StreamReader(stream, false))
        {
            using (var reader = XmlReader.Create(sr))
            {
                return (T)serializer.Deserialize(reader);
            }
        }
    }