答案:C#序列化通过将对象转为可存储或传输的格式来保存桌面应用数据,常用技术包括XmlSerializer、System.Text.Json、Newtonsoft.Json、DataContractSerializer和BinaryFormatter,各自适用于不同场景。System.Text.Json因性能好、轻量且为官方推荐,适合现代应用;Newtonsoft.Json功能强大,适合复杂JSON处理;XmlSerializer适合需XML兼容的场景;DataContractSerializer提供精细控制;BinaryFormatter虽高效但有安全风险,不推荐用于不可信数据。选择时应考虑数据结构、性能、可读性、互操作性和安全性,优先推荐System.Text.Json或Newtonsoft.Json,避免使用BinaryFormatter。

C#的序列化技术通过将应用程序中的对象状态转换为一种可持久化(如文件存储)或可传输的格式(如网络传输),从而实现桌面应用数据的保存。当需要时,这些数据可以被反序列化回内存中的对象,让应用恢复到之前的状态。这对于保存用户设置、应用配置、用户生成的数据(比如游戏存档、笔记)等场景至关重要。
保存桌面应用数据,我们通常会定义一个或多个数据模型类(POCO,Plain Old CLR Objects),这些类包含了我们需要保存的所有数据。然后,利用C#内置或第三方提供的序列化器,将这些类的实例(即我们应用的状态数据)写入到文件系统。反之,当应用启动或需要加载数据时,再从文件中读取这些数据,通过反序列化操作重新构建内存中的对象。
以一个简单的用户设置为例,我们可能有一个
UserSettings
public class UserSettings
{
public string UserName { get; set; }
public bool EnableDarkMode { get; set; }
public int FontSize { get; set; }
public DateTime LastLogin { get; set; } // 示例:DateTime类型
}保存这个对象到文件,通常的流程会是这样:
UserSettings
System.Text.Json
Newtonsoft.Json
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Serialize
加载数据时,流程则反过来:
Deserialize
UserSettings
这个过程听起来有点像魔法,但本质上就是把内存中的复杂数据结构,变成了一串文本或二进制数据,方便存储和传输。
在C#的世界里,序列化技术选项还挺多的,每种都有自己的“脾气”和适用场景。我个人在项目中用得比较多的,主要是XML和JSON相关的序列化。
1. System.Xml.Serialization.XmlSerializer
优点:
缺点:
相对冗余: XML标签比较多,文件体积通常比JSON或二进制大。
性能一般: 对于大量数据或频繁的序列化/反序列化操作,性能可能不如JSON或二进制。
限制较多: 被序列化的类需要有公共的无参构造函数,且只能序列化公共属性和字段。处理复杂类型(如字典)有时会比较麻烦。
代码示例:
using System.Xml.Serialization;
using System.IO;
public static void SaveXml(UserSettings settings, string filePath)
{
XmlSerializer serializer = new XmlSerializer(typeof(UserSettings));
using (FileStream stream = new FileStream(filePath, FileMode.Create))
{
serializer.Serialize(stream, settings);
}
}
public static UserSettings LoadXml(string filePath)
{
if (!File.Exists(filePath)) return null;
XmlSerializer serializer = new XmlSerializer(typeof(UserSettings));
using (FileStream stream = new FileStream(filePath, FileMode.Open))
{
return (UserSettings)serializer.Deserialize(stream);
}
}2. System.Text.Json
优点:
System.Text.Json
缺点:
相对较新: 在旧的.NET Framework项目中可能需要额外引入。
配置项: 虽然灵活,但有时需要一些配置(如属性命名策略、日期格式)来满足特定需求。
代码示例:
using System.Text.Json;
using System.IO;
public static void SaveJson(UserSettings settings, string filePath)
{
var options = new JsonSerializerOptions { WriteIndented = true }; // 方便阅读
string jsonString = JsonSerializer.Serialize(settings, options);
File.WriteAllText(filePath, jsonString);
}
public static UserSettings LoadJson(string filePath)
{
if (!File.Exists(filePath)) return null;
string jsonString = File.ReadAllText(filePath);
return JsonSerializer.Deserialize<UserSettings>(jsonString);
}3. Newtonsoft.Json
优点:
缺点:
第三方依赖: 需要通过NuGet安装,增加了项目依赖。
性能略低于System.Text.Json
System.Text.Json
Newtonsoft.Json
代码示例:
using Newtonsoft.Json;
using System.IO;
public static void SaveNewtonsoftJson(UserSettings settings, string filePath)
{
string jsonString = JsonConvert.SerializeObject(settings, Formatting.Indented);
File.WriteAllText(filePath, jsonString);
}
public static UserSettings LoadNewtonsoftJson(string filePath)
{
if (!File.Exists(filePath)) return null;
string jsonString = File.ReadAllText(filePath);
return JsonConvert.DeserializeObject<UserSettings>(jsonString);
}4. System.Runtime.Serialization.DataContractSerializer
[DataContract]
[DataMember]
XmlSerializer
XmlSerializer
5. System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
BinaryFormatter
就我个人经验而言,对于新的桌面应用,我几乎总是倾向于使用
System.Text.Json
XmlSerializer
Newtonsoft.Json
System.Text.Json
BinaryFormatter
选择合适的序列化方式,就像选择合适的工具来完成一项工作,需要考虑数据的特性、应用的需求以及未来的扩展性。这里有一些我个人在做选择时会考量的点:
数据类型与结构复杂性:
System.Text.Json
XmlSerializer
Newtonsoft.Json
System.Text.Json
BinaryFormatter
DataContractSerializer
[DataMember]
Newtonsoft.Json
JsonConverter
性能与文件大小:
System.Text.Json
可读性与手动修改需求:
互操作性与跨平台:
安全性考量:
BinaryFormatter
综合来看,我的通用建议是:优先选择System.Text.Json
Newtonsoft.Json
XmlSerializer
BinaryFormatter
即便序列化看起来很直接,但在实际开发中,我们还是会遇到一些“小麻烦”。这些问题处理不好,轻则数据丢失,重则应用崩溃。
版本兼容性问题(Schema Evolution): 这是最常见也最令人头疼的问题之一。当你的应用程序发布了新版本,数据模型类(例如
UserSettings
System.Text.Json
Newtonsoft.Json
XmlSerializer
int
string
Newtonsoft.Json
[JsonProperty("oldName")]JsonConverter
循环引用问题: 当你的对象图中有A引用B,B又引用A的情况时,序列化器可能会陷入无限循环,最终导致栈溢出。
Order
Customer
Customer
List<Order>
Newtonsoft.Json
ReferenceLoopHandling.Serialize
ReferenceLoopHandling.Ignore
ReferenceLoopHandling.Error
Ignore
System.Text.Json
JsonSerializerOptions
ReferenceHandler = ReferenceHandler.Preserve
$id
$ref
Customer
Order
Order
性能瓶颈: 对于非常大的对象图或需要频繁进行序列化/反序列化操作的场景,性能可能会成为问题。
System.Text.Json
XmlSerializer
File.WriteAllTextAsync
File.ReadAllTextAsync
System.Text.Json
JsonSerializer.SerializeAsync
安全性问题(特别针对BinaryFormatter
BinaryFormatter
BinaryFormatter
文件路径与权限问题: 桌面应用保存数据时,经常会遇到文件路径不存在或没有写入权限的问题。
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
以上就是C#的序列化技术如何保存桌面应用数据?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号