反序列化从 SQL 查询返回的 XML 对象?

Posted

技术标签:

【中文标题】反序列化从 SQL 查询返回的 XML 对象?【英文标题】:deserialize an XML object returned from SQL query? 【发布时间】:2015-09-25 13:08:32 【问题描述】:

我需要反序列化一个“应该”从 SQL 查询返回的 XML 对象。

我在 JSON 中工作,但不能使用 JSON,所以我转向 XML。 JsonConvert 功能将我的结果放在一行中。但我不确定如何处理 SQL 给我的内容。

当写入服务器时,Table 正在获取 Xdocument 类型,写入 xml 数据类型单元格。

        if (do_sql_read)
        
            List<string> usernames = new List<string>();
            List<int> ids = new List<int>();
            string sql_load;

            Player player_after_load = new Player();

            //multiple
            string select_string = @"SELECT * FROM [Table]";

            using (SqlConnection sql_connection_a = new SqlConnection( GetConnectionString() ) )
            
                sql_connection_a.Open();

                using (SqlCommand command = new SqlCommand(select_string, sql_connection_a))
                
                    SqlDataReader reader = command.ExecuteReader(CommandBehavior.Default);

                    // XML VERSION
                    while (reader.Read())
                    
                        int iii = reader.GetInt32(0);    // unique id int
                        string name = reader.GetString(1);  // Name string
                        sql_load = reader.GetString(2);
                        usernames.Add(name);
                        ids.Add(iii);

                        XmlSerializer XML_serializer = new XmlSerializer (typeof(Player));


                        // <<<<< THIS PART ??? >>>
                        player_after_load = (Player)XML_serializer.Deserialize (sql_load);

                        Console.WriteLine("SQLPlayer:  " + iii + " " + player_after_load.name + " " + player_after_load.health + " " + player_after_load.mana);
                    


                    /* JSON VERSION WORKS
                    while (reader.Read())
                    
                        int iii = reader.GetInt32(0);    // unique id int
                        string name = reader.GetString(1);  // Name string
                        sql_load = reader.GetString(2);
                        usernames.Add(name);
                        ids.Add(iii);

                        player_after_load = JsonConvert.DeserializeObject<Player>(sql_load);
                        Console.WriteLine("SQLPlayer:  " + iii + " " + player_after_load.name + " " + player_after_load.health + " " + player_after_load.mana);
                    
                    */
                
            

         // end do_sql_string

【问题讨论】:

看看我对另一个问题的回答是否有帮助:***.com/questions/27003701/parse-this-xml-to-object/… 您似乎正在尝试使用 XmlSerializer 反序列化 JSON 字符串。我认为这行不通(因为您的 JsonConvert 调用确实有效,我假设 sql_load - 字段索引 2 - 包含 JSON 数据,而不是 XML)。 我已将所有内容都转换为 XML 反序列化时有没有报错? 行: player_after_load = (Player)XML_serializer.Deserialize (sql_load);是唯一的错误。 “最佳重载方法匹配...具有无效参数。我知道这是因为我没有正确反序列化。我真的不知道返回到 sql_load 的内容是什么。它是 json 字符串,现在是它的 XMLdocument。 【参考方案1】:

XMLSerializer 的Deserialize 方法没有任何采用字符串的重载。您可以改用Stream(使用MemoryStream):

using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 
    player_after_load = (Player)XML_serializer.Deserialize(ms);

P.s:你的变量名很糟糕。您应该会看到 C# 编码约定。

【讨论】:

我会在 MemoryStream 周围抛出一个 using 语句。 是的,这些名字肯定不好。但是,作为对您(非常有帮助的)回复的回应......如果内存流不可用怎么办(我不能使用 System.IO) @MichaelMeritt 你可以使用 XmlReader 吗?你可以用它做同样的事情。 @MichaelMeritt 我担心这是不可能的,因为 XmlSerializer 的每个重载都使用 System.IO 命名空间。也许你现在的选择是BinaryFormatter,就像 redmanmale 的回答一样 好吧,这有点疯狂,但是您可以使用 XmlDocument.LoadXml 将您的字符串加载到该文档中。然后您使用 XmlNodeReader 读取该 XmlDocument。没有 System.IO。【参考方案2】:

我只是添加这个答案,因为你说你不能使用 System.IO。如果您可以使用 System.IO,请参阅 DatVM 的答案。这是您可以执行的操作的示例。我对此进行了简化,使其包含一个要反序列化的类,并且可以在任何控制台应用程序中运行。

using System;
using System.Xml;
using System.Xml.Serialization;

public class Player

    public string Name get; set;



public class Program

    public static void Main()
    
        var str = "<Player><Name>Bobby</Name></Player>";
        var doc = new XmlDocument();
        var XML_serializer = new XmlSerializer(typeof(Player));
        doc.LoadXml(str);
        Player player_after_load;
        using (var nodeReader = new XmlNodeReader(doc))
        
            player_after_load = (Player)XML_serializer.Deserialize(nodeReader);
        
        Console.WriteLine(player_after_load.Name);

    

控制台结果

Bobby

【讨论】:

这是最直接的答案!谢谢!【参考方案3】:

但在此之前,您需要创建具有[Serializable] 属性的类:

[Serializable]
public class MyObject

     public int n1;
     public int n2;
     public String str;
 

然后使用标准反序列化器:

IFormatter formatter = new BinaryFormatter();
MyObject obj = (MyObject) formatter.Deserialize(your_xml_object);

【讨论】:

以上是关于反序列化从 SQL 查询返回的 XML 对象?的主要内容,如果未能解决你的问题,请参考以下文章

怎么将一个数组序列化与反序列化????越详细越好!!!可以加分

反序列化后无法获取从xml文件返回的项目列表

从api逻辑任务和反序列化对象并反序列化json

将 xml 反序列化为对象时出错:System.FormatException 输入字符串格式不正确

2:如何反序迭代一个序列(字符串,列表,元组)

序列化和反序列化