反序列化对象后如何为类属性赋值?以UserProfile为例
解决UserProfile反序列化后属性赋值不重置的问题
针对你的需求,我们可以从现有代码优化和扩展场景两个层面来处理:
1. 单属性场景的直接优化
当前核心逻辑可行,但存在细节问题需要修正,同时可添加判断避免不必要的属性重置:
修复代码Bug
- 路径统一:
Load方法中混用了RoBoost.Common.FileSystemConstants.ProfileDirectory和ProfileDirectory,需保持一致; - Save方法逻辑修正:原代码仅当文件存在时才写入,导致首次保存无法创建配置文件,应直接调用
File.WriteAllText(该方法会自动创建不存在的文件)。
避免不必要的属性重置
如果希望仅当反序列化得到的属性值与默认值不同时才更新Default实例,可以添加值判断:
public class UserProfile{ public int SplitterPosition { get; set; } public static readonly UserProfile Default = new UserProfile(); public const string FileName = "UserProfileSettings.json"; // 统一路径常量 private static string ProfileDirectory => RoBoost.Common.FileSystemConstants.ProfileDirectory; public UserProfile() { SplitterPosition = 313; } public static void Load() { string filePath = Path.Combine(ProfileDirectory, FileName); if (File.Exists(filePath)) { UserProfile user = RoboostSerializer.DeserializeObject<UserProfile>(File.ReadAllText(filePath)); // 仅当反序列化的值不是默认值时才赋值,避免重置 if (user.SplitterPosition != default) { Default.SplitterPosition = user.SplitterPosition; } } } public static void Save() { string filePath = Path.Combine(ProfileDirectory, FileName); string serialized = RobotSerializer.SerializeObject(Default); // 直接写入,自动创建文件 File.WriteAllText(filePath, serialized); } }
2. 多属性扩展场景的批量赋值方案
如果后续需要添加更多属性,手动逐个赋值会冗余重复,此时可以用反射实现批量属性更新,同时保留“不重置不必要属性”的逻辑:
public static void Load() { string filePath = Path.Combine(ProfileDirectory, FileName); if (File.Exists(filePath)) { UserProfile user = RoboostSerializer.DeserializeObject<UserProfile>(File.ReadAllText(filePath)); UserProfile defaultInstance = new UserProfile(); // 获取类的默认属性值 // 遍历所有可写公开属性 foreach (var prop in typeof(UserProfile).GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (prop.CanWrite) { var deserializedValue = prop.GetValue(user); var defaultValue = prop.GetValue(defaultInstance); // 仅当反序列化值与默认值不同时,才更新Default实例 if (!Equals(deserializedValue, defaultValue)) { prop.SetValue(Default, deserializedValue); } } } } }
核心逻辑说明
- 直接赋值方案适合属性数量少的场景,逻辑清晰且性能开销小;
- 反射批量赋值适合多属性场景,减少代码维护成本;
- 通过对比反序列化值与类的默认值,实现“仅更新有变化的属性”,避免不必要的重置操作。
内容的提问来源于stack exchange,提问作者Vishakha Suthar
相关产品推荐
相关产品推荐

