当前位置:首页 > C# > 正文

C#嵌套类的序列化处理(从入门到实战:轻松掌握嵌套类与JSON序列化的技巧)

在C#开发中,C#嵌套类序列化是一个常见但容易被忽视的问题。很多初学者在尝试将包含嵌套类的对象转换为JSON格式时会遇到各种问题。本文将手把手教你如何正确地对.NET嵌套类处理进行序列化和反序列化,即使是编程小白也能轻松上手!

什么是嵌套类?

嵌套类(Nested Class)是指定义在另一个类内部的类。外层的类称为“外部类”或“封闭类”,内层的类就是“嵌套类”。嵌套类可以访问外部类的私有成员,这在某些设计模式中非常有用。

C#嵌套类的序列化处理(从入门到实战:轻松掌握嵌套类与JSON序列化的技巧) C#嵌套类序列化  JSON序列化嵌套类 C#内部类序列化 .NET嵌套类处理 第1张

为什么嵌套类序列化会出问题?

默认情况下,C#的序列化器(如 System.Text.JsonNewtonsoft.Json)可以处理大多数对象,但当嵌套类是非公有(private、protected)或没有无参构造函数时,就可能无法正确序列化。此外,如果嵌套类使用了复杂的引用关系,也可能导致循环引用等问题。

实战:使用 System.Text.Json 序列化嵌套类

我们以 .NET 6+ 中推荐的 System.Text.Json 为例,演示如何正确序列化包含嵌套类的对象。

步骤1:定义外部类和嵌套类

public class Person{    public string Name { get; set; }    public int Age { get; set; }    // 公有嵌套类    public class Address    {        public string Street { get; set; }        public string City { get; set; }    }    public Address HomeAddress { get; set; }}

步骤2:创建对象并序列化

using System.Text.Json;var person = new Person{    Name = "张三",    Age = 30,    HomeAddress = new Person.Address    {        Street = "中山路123号",        City = "上海"    }};string json = JsonSerializer.Serialize(person, new JsonSerializerOptions{    WriteIndented = true // 格式化输出});Console.WriteLine(json);

输出结果:

{  "Name": "张三",  "Age": 30,  "HomeAddress": {    "Street": "中山路123号",    "City": "上海"  }}

关键注意事项

  • 嵌套类必须是公有的(public):否则序列化器无法访问其属性。
  • 确保嵌套类有公共的无参构造函数,或者使用支持参数化构造函数的序列化配置。
  • 避免循环引用:如果外部类持有嵌套类的引用,而嵌套类又反过来引用外部类,会导致无限递归。
  • 使用 JsonSerializerOptions 可以自定义序列化行为,比如忽略空值、更改命名策略等。

使用 Newtonsoft.Json 的替代方案

如果你仍在使用 Newtonsoft.Json(也叫 Json.NET),处理方式类似:

using Newtonsoft.Json;string json = JsonConvert.SerializeObject(person, Formatting.Indented);Person deserialized = JsonConvert.DeserializeObject<Person>(json);

Newtonsoft.Json 对非公有嵌套类的支持稍好一些,但仍建议保持嵌套类为 public 以确保兼容性。

总结

通过本文,你已经掌握了 JSON序列化嵌套类 的基本方法。记住:只要嵌套类是公有的、具有可访问的属性,并且没有循环引用,C# 的主流序列化库都能轻松处理。无论是使用 System.Text.Json 还是 Newtonsoft.JsonC#内部类序列化 都不再是难题!

希望这篇教程能帮助你在实际项目中顺利处理嵌套类的序列化需求。如有疑问,欢迎在评论区交流!