反序列化从 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 对象?的主要内容,如果未能解决你的问题,请参考以下文章
怎么将一个数组序列化与反序列化????越详细越好!!!可以加分