作者:乐家巢欧美家具_636 | 来源:互联网 | 2023-08-20 03:43
(精华)2020年8月12日 C#基础知识点 序列化反序列化(XML,Json,二进制,soap)
public class SerializeHelper
{
///
/// 二进制序列化器
///
public static void BinarySerialize()
{
//使用二进制序列化对象
string fileName = Path.Combine(Constant.SerializeDataPath, @"BinarySerialize.txt");//文件名称与路径
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{//需要一个stream,这里是直接写入文件了List pList = DataFactory.BuildProgrammerList();BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器binFormat.Serialize(fStream, pList);
}
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{//需要一个stream,这里是来源于文件BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器//使用二进制反序列化对象fStream.Position = 0;//重置流位置List pList = (List)binFormat.Deserialize(fStream);//反序列化对象
}
}
///
/// soap序列化器
///
public static void SoapSerialize()
{
//使用Soap序列化对象
string fileName = Path.Combine(Constant.SerializeDataPath, @"SoapSerialize.txt");//文件名称与路径
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{List pList = DataFactory.BuildProgrammerList();SoapFormatter soapFormat = new SoapFormatter();//创建二进制序列化器//soapFormat.Serialize(fStream, list);//SOAP不能序列化泛型对象soapFormat.Serialize(fStream, pList.ToArray());
}
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{SoapFormatter soapFormat = new SoapFormatter();//创建二进制序列化器//使用二进制反序列化对象fStream.Position = 0;//重置流位置List pList = ((Programmer[])soapFormat.Deserialize(fStream)).ToList();//反序列化对象
}
}
//BinaryFormatter序列化自定义类的对象时,序列化之后的流中带有空字符,以致于无法反序列化,反序列化时总是报错“在分析完成之前就遇到流结尾”(已经调用了stream.Seek(0, SeekOrigin.Begin);)。
//改用XmlFormatter序列化之后,可见流中没有空字符,从而解决上述问题,但是要求类必须有无参数构造函数,而且各属性必须既能读又能写,即必须同时定义getter和setter,若只定义getter,则反序列化后的得到的各个属性的值都为null。
///
/// XML序列化器
///
public static void XmlSerialize()
{
//使用XML序列化对象
string fileName = Path.Combine(Constant.SerializeDataPath, @"Student.xml");//文件名称与路径
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{List pList = DataFactory.BuildProgrammerList();XmlSerializer xmlFormat = new XmlSerializer(typeof(List));//创建XML序列化器,需要指定对象的类型xmlFormat.Serialize(fStream, pList);
}
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{XmlSerializer xmlFormat = new XmlSerializer(typeof(List));//创建XML序列化器,需要指定对象的类型//使用XML反序列化对象fStream.Position = 0;//重置流位置List pList = pList = (List)xmlFormat.Deserialize(fStream);
}
}
///
/// json也可以的
///
public static void Json()
{
List pList = DataFactory.BuildProgrammerList();
string result = JsonHelper.ObjectToString>(pList);
List pList1 = JsonHelper.StringToObject>(result);
}
}
public class JsonHelper
{
#region Json
///
/// JavascriptSerializer
///
///
///
///
public static string ObjectToString(T obj)
{
JavascriptSerializer jss = new JavascriptSerializer();
return jss.Serialize(obj);
}
///
/// JavascriptSerializer
///
///
///
///
public static T StringToObject(string content)
{
JavascriptSerializer jss = new JavascriptSerializer();
return jss.Deserialize(content);
}
///
/// JsonConvert.SerializeObject
///
///
///
///
public static string ToJson(T obj)
{
return JsonConvert.SerializeObject(obj);
}
///
/// JsonConvert.DeserializeObject
///
///
///
///
public static T ToObject(string content)
{
return JsonConvert.DeserializeObject(content);
}
#endregion Json
}
///
/// 使用序列化器完成的
///
public class XmlHelper
{
///
/// XmlSerializer序列化实体为字符串
///
///
///
///
public static string ToXml(T t) where T : new()
{
XmlSerializer xmlSerializer = new XmlSerializer(t.GetType());
Stream stream = new MemoryStream();
xmlSerializer.Serialize(stream, t);
stream.Position = 0;
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
return text;
}
///
/// 字符串序列化成XML
///
///
///
///
public static T ToObject(string content) where T : new()
{
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(content)))
{XmlSerializer xmlFormat = new XmlSerializer(typeof(T));return (T)xmlFormat.Deserialize(stream);
}
}
///
/// 文件反序列化成实体
///
///
///
///
public static T FileToObject(string fileName) where T : new()
{
string CurrentXMLPath = ConfigurationManager.AppSettings["CurrentXMLPath"];
fileName = Path.Combine(CurrentXMLPath, @"Student.xml");
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{XmlSerializer xmlFormat = new XmlSerializer(typeof(T));return (T)xmlFormat.Deserialize(fStream);
}
}
}