C#-序列化与反序列化(xml、json)
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
目录
一、序列化
1、Json序列化、反序列化
方式一:使用Newtonsoft.Json安装包(推荐1)
System.Text.Json(推荐2)
常用方法:
JsonConvert.SerializeObject() //序列化
JsonConvert.DeserializeObject<T>() //反序列化
方式二:使用DataContractJsonSerializer
注意: 序列化类要添加[DataContract]特性
序列化类成员要添加[DataMember]特性
DataContractJsonSerializer json= new DataContractJsonSerializer(typeof(List<JsonTest>));
using (MemoryStream ms = new MemoryStream())
{
json.WriteObject(ms, jsonTests);
res=Encoding.UTF8.GetString(ms.ToArray());
}
tbox.Text = res;
反序列化用ReadObject()方法
2、Xml序列化、反序列化
- 引入命名空间System.Xml.Serialization;
- 创建XmlSerializer类实例(通过构造函数指定类型);
- 使用Serialize()方法序列化;
- 使用Deserialize()方法反序列化
XmlSerializer xml = new XmlSerializer(jsonTests.GetType());
var path = Path.Combine(Directory.GetCurrentDirectory(), @"../../Xml", "mydata.xml");
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
{
xml.Serialize(fs, jsonTests); //Xml序列化
}
using (FileStream fs = new FileStream(path, FileMode.Open))
{
//XmlReader reader = new XmlTextReader(fs);
var data = xml.Deserialize(fs) as List<JsonTest>; //Xml反序列化
tbox2.Text = data[0].Name +"\n"+ data[0].Value;
}
二、扩展(只做了解)
1、序列到指定xml文件内
实例化一个XmlSerializer对象,通过实例对象的Serialize()方法将指定类序列化到一个指定路径下的xml文件。
示例代码 :
/// <summary>
/// 序列化一个类到指定路径下的xml文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="name"></param>
/// <returns>序列化成功返回success,失败返回错误信息</returns>
public static string SerializeXml<T>(T name)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
string path = Path.Combine(Environment.CurrentDirectory,@"..\..\Data\data.xml");
StreamWriter xsw = new StreamWriter(path);
serializer.Serialize(xsw, name);
/***************扩展:序列化类为xml,返回序列化后的字符串
XmlSerializer serializer = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
byte[] buffer =stream.ToArray();
string xml = Encoding.ASCII.GetString(buffer);
stream.Close();
string xml = GetXml.GetXmlServer();
return xml;
*********************/
xsw.Close();
}
catch (Exception ex)
{
return ex.Message;
}
return "success";
}
2、查找并更新Xml文件内容
1、使用XmlDocument创建一个实例对象xmldoc;
2、使用xmldoc的Load()方法加载一个xml文件路径;
3、通过xmldoc的SelectSingleNode()查找一个指定节点;
4、获取该节点的所有孩子节点到节点列表;
5、遍历节点列表(要将XmlNode转化成XmlElement类型使用);
6、更新数据后保存;
示例代码:
public void SaveData(MainWinModelView modelview)
{
string xmlfilename = System.IO.Path.Combine(Environment.CurrentDirectory, @"Data\MyData.xml");
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(xmlfilename);
XmlNode node = xmldoc.SelectSingleNode("Products");
XmlNodeList node1s = node.ChildNodes;
string product="product"+modelview.SelectedIndex.ToString();
foreach (XmlNode node1 in node1s)
{
XmlElement xelem1 = node1 as XmlElement;
if (xelem1.GetAttribute("Name") == product)
{
XmlNodeList node2s = xelem1.ChildNodes;
foreach (XmlNode node2 in node2s)
{
XmlElement xelem2 = node2 as XmlElement;
if (xelem2.Name == "name")
xelem2.InnerText = modelview.Name;
else if(xelem2.Name=="description")
xelem2.InnerText = modelview.Description;
else if(xelem2.Name=="Image_path")
xelem2.InnerText=modelview.Image_path.ToString();
}
break;
}
}
xmldoc.Save(xmlfilename);
MessageBox.Show("Save success!");
}
3、获取xml文件中的内容
通过XDocument类方式获取
示例代码:
public List<Product> GetProducts()
{
string xmlfilename=System.IO.Path.Combine(Environment.CurrentDirectory,@"Data\MyData.xml");
List<Product> productList = new List<Product>();
XDocument xDocument = XDocument.Load(xmlfilename);
var pros = xDocument.Descendants("product");
foreach (var pro in pros)
{
Product product = new Product();
product.Name = pro.Element("name").Value;
product.Description = pro.Element("description").Value;
product.Image_path=pro.Element("Image_path").Value;
productList.Add(product);
}
return productList;
}
GitHub 加速计划 / js / json
18
5
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:3 个月前 )
2d42229f
* Support BSON uint64 de/serialization
Signed-off-by: Michael Valladolid <mikevalladolid@gmail.com>
* Treat 0x11 as uint64 and not timestamp specific
Signed-off-by: Michael Valladolid <mikevalladolid@gmail.com>
---------
Signed-off-by: Michael Valladolid <mikevalladolid@gmail.com> 5 天前
1809b3d8
Signed-off-by: Niels Lohmann <mail@nlohmann.me> 5 天前
更多推荐
已为社区贡献2条内容
所有评论(0)