C#【必备技能篇】序列化与反序列化(json、xml、二进制文件)

时间:2025-03-27 14:43:11
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; namespace ConsoleApp6 { class Program { static void Main(string[] args) { Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f }; //序列化文件 Serializer.ObjectToFile(book, @".\"); //序列化为字符串 string result = Serializer.ObjectToString<Book>(book); Console.WriteLine(result);//这里显示为乱码 Console.WriteLine("——————————————————"); //文件反序列化为类型 Book outBook = Serializer.FileToObject<Book>(@".\") as Book; Console.WriteLine(outBook.ID); Console.WriteLine(outBook.Name); Console.WriteLine(outBook.Price); Console.WriteLine("——————————————————"); //字符串反序列化为类型【测试失败,报异常::“没有对象“201326592”的映射。”】 //Book outBook1 = <Book>(result); //(); //(); //(); Console.Read(); } } public class Serializer { /// <summary> /// 将对象序列化为字符串 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="t">实例</param> /// <returns>字符串</returns> public static string ObjectToString<T>(T t) { BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream stream = new MemoryStream()) { formatter.Serialize(stream, t); string result = System.Text.Encoding.UTF8.GetString(stream.ToArray()); return result; } } /// <summary> /// 将对象序列化为文件 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="t">实例</param> /// <param name="path">存放路径</param> public static void ObjectToFile<T>(T t, string path) { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { formatter.Serialize(stream, t); stream.Flush(); } } /// <summary> /// 将字符串反序列为类型 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="s">字符串</param> /// <returns>对象</returns> public static T StringToObject<T>(string s) where T : class { byte[] buffer = System.Text.Encoding.UTF8.GetBytes(s); BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream stream = new MemoryStream(buffer)) { T result = formatter.Deserialize(stream) as T;//报异常::“没有对象“201326592”的映射。” return result; } } /// <summary> /// 将文件反序列化为对象 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="path">路径</param> /// <returns>对象</returns> public static T FileToObject<T>(string path) where T : class { using (FileStream stream = new FileStream(path, FileMode.Open)) { BinaryFormatter formatter = new BinaryFormatter(); T result = formatter.Deserialize(stream) as T; return result; } } } }