.NET中如何自定义序列化和反序列化的过程
封面图
•
2026-04-25
•
.NET
50
0
0
0
在 .NET 中,自定义序列化和反序列化的过程可以通过以下几种方式实现: --- ## 一、使用 `ISerializable` 接口 这是 .NET 提供的一种标准方式,允许你控制对象的序列化和反序列化过程。 ### 1. 实现 `ISerializable` 接口 ```csharp [Serializable] public class MyClass : ISerializable { public int Id { get; set; } public string Name { get; set; } // 构造函数(用于反序列化) protected MyClass(SerializationInfo info, StreamingContext context) { Id = info.GetInt32("Id"); Name = info.GetString("Name"); } // 用于序列化的方法 public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("Id", Id); info.AddValue("Name", Name); } } ``` ### 2. 使用 `BinaryFormatter` 进行序列化 ```csharp var obj = new MyClass { Id = 1, Name = "Test" }; using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); // 反序列化 stream.Position = 0; var deserialized = (MyClass)formatter.Deserialize(stream); } ``` > ⚠️ 注意:`BinaryFormatter` 在 .NET Core 和 .NET 5+ 中已被弃用,不建议使用。推荐使用其他序列化方式。 --- ## 二、使用 `DataContractSerializer` 这是另一种标准的序列化方式,适合 WCF 或数据契约场景。 ### 1. 定义类并添加 `[DataContract]` 和 `[DataMember]` 属性 ```csharp [DataContract] public class MyClass { [DataMember] public int Id { get; set; } [DataMember] public string Name { get; set; } } ``` ### 2. 序列化和反序列化 ```csharp var obj = new MyClass { Id = 1, Name = "Test" }; using (var stream = new MemoryStream()) { var serializer = new DataContractSerializer(typeof(MyClass)); serializer.WriteObject(stream, obj); stream.Position = 0; var deserialized = (MyClass)serializer.ReadObject(stream); } ``` --- ## 三、使用 `System.Text.Json`(推荐) 从 .NET Core 3.0 开始,微软推荐使用 `System.Text.Json` 作为默认的 JSON 序列化库。 ### 1. 自定义序列化逻辑(通过 `JsonConverter`) ```csharp public class MyClass { public int Id { get; set; } public string Name { get; set; } } public class MyClassConverter : JsonConverter<MyClass> { public override MyClass Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var obj = new MyClass(); while (reader.Read()) { if (reader.TokenType == JsonTokenType.PropertyName) { var propertyName = reader.GetString(); reader.Read(); switch (propertyName) { case "Id": obj.Id = reader.GetInt32(); break; case "Name": obj.Name = reader.GetString(); break; } } } return obj; } public override void Write(Utf8JsonWriter writer, MyClass value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteNumber("Id", value.Id); writer.WriteString("Name", value.Name); writer.WriteEndObject(); } } ``` ### 2. 使用时注册转换器 ```csharp var options = new JsonSerializerOptions { Converters = { new MyClassConverter() } }; string json = JsonSerializer.Serialize(new MyClass { Id = 1, Name = "Test" }, options); MyClass obj = JsonSerializer.Deserialize<MyClass>(json, options); ``` --- ## 四、使用 `Newtonsoft.Json`(Json.NET) 这是一个非常流行的第三方 JSON 库,功能强大,支持更复杂的自定义。 ### 1. 自定义序列化/反序列化(通过 `JsonConverter`) ```csharp public class MyClass { public int Id { get; set; } public string Name { get; set; } } public class MyClassConverter : JsonConverter<MyClass> { public override MyClass ReadJson(JsonReader reader, Type objectType, MyClass existingValue, bool hasExistingValue, JsonSerializer serializer) { var obj = new MyClass(); while (reader.Read()) { if (reader.TokenType == JsonToken.PropertyName) { var propertyName = reader.Value.ToString(); reader.Read(); switch (propertyName) { case "Id": obj.Id = reader.Value != null ? (int)reader.Value : 0; break; case "Name": obj.Name = reader.Value?.ToString(); break; } } } return obj; } public override void WriteJson(JsonWriter writer, MyClass value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName("Id"); writer.WriteValue(value.Id); writer.WritePropertyName("Name"); writer.WriteValue(value.Name); writer.WriteEndObject(); } } ``` ### 2. 使用时注册转换器 ```csharp var settings = new JsonSerializerSettings(); settings.Converters.Add(new MyClassConverter()); string json = JsonConvert.SerializeObject(new MyClass { Id = 1, Name = "Test" }, settings); MyClass obj = JsonConvert.DeserializeObject<MyClass>(json, settings); ``` --- ## 总结 | 方法 | 是否需要实现接口 | 适用场景 | |------|------------------|----------| | `ISerializable` | 是 | 二进制序列化(已弃用) | | `DataContractSerializer` | 是 | WCF、数据契约 | | `System.Text.Json` | 否(通过 `JsonConverter`) | 现代 .NET 项目,JSON 序列化 | | `Newtonsoft.Json` | 否(通过 `JsonConverter`) | 高度灵活的 JSON 处理 | --- 如果你有具体的类结构或需求(如只序列化部分字段、处理嵌套对象等),可以告诉我,我可以帮你定制更详细的实现。
上一篇:
什么是 CTS、CLS 和CLR
标题录入,一次不能超过6条
留言
评论