You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中JsonUtility.ToJson异常:子类转父类后仍序列化子类字段

解决JsonUtility序列化转换后对象仍保留原类型字段的问题

这个问题我之前在Unity项目里也碰到过!其实原因很简单——Unity的JsonUtility是依据对象实际运行时的类型来序列化的,不是你强制转换后的编译时类型。哪怕你把B实例转成A类型,它本质上还是个B对象,所以password字段还是会被序列化进去。

下面给你几个实用的解决办法:

1. 手动创建目标类型实例并复制属性

最直接的方式就是新建一个A类型的实例,把B实例中属于A的属性复制过去,再序列化这个纯粹的A对象:

// 假设已有B实例
B myInstanceB = new B { name = "Rowan", password = "mySecurePass" };

// 创建A实例并复制属性
A safeInstance = new A { name = myInstanceB.name };

// 序列化A实例,结果只会包含name字段
string json = JsonUtility.ToJson(safeInstance);

这种方法完全可控,不用担心意外序列化敏感字段,适合字段数量不多的场景。

2. 用特性控制字段序列化

如果不想手动复制属性,可以在B类的敏感字段上添加[HideInInspector]特性,让JsonUtility忽略这个字段的序列化:

class A {
    public string name;
}

class B : A {
    [HideInInspector]
    public string password;
}

不过要注意,这个特性是全局生效的——只要是B类型的实例,序列化时都不会包含password字段。如果某些场景下你需要序列化password,这个方法就不太灵活了。

3. 换用支持编译时类型序列化的库(可选)

如果你的项目允许引入第三方库,Newtonsoft.Json(Unity官方也提供了适配包)支持基于编译时类型序列化,这样强制转换后的类型就能生效:

// 转换为A类型后,指定序列化类型为A
string json = JsonConvert.SerializeObject(myInstanceB as A, typeof(A));

这样序列化结果就只会包含A类定义的字段,不会出现password。

内容的提问来源于stack exchange,提问作者Rowan Gontier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:35:39