【发布时间】:2019-03-18 08:21:20
【问题描述】:
我有一个想法,但我不明白怎么做。
我创建了一个abstract class AJsonSerializer。我想在那里 Serialize 和 Deserialize 上课。
public abstract class AJsonSerializer {
public string ToJson() {
return JsonConvert.SerializeObject(this);
}
public T FromJson<T>(string jsonString) where T : class {
return JsonConvert.DeserializeObject<T>(jsonString);
}
}
我有一个类User,我继承自我的抽象类:
public class User : AJsonSerializer {
public string PublicKey { get; set; }
public int User_ID { get; set; }
}
现在我可以这样做了
internal static void Get_UserData(string username, ref User user) {
if (ReadFromCache(username, out string value)) {
user = user.FromJson<User>(value);
} else {
DataAccess.Get_UserData(username, out string user_public_key, out int id_user);
user.PublicKey = user_public_key;
user.User_ID = id_user;
value = user.ToJson();
SaveToCashe(username, value);
}
}
这一行看起来很难看:user = user.FromJson<User>(value);
我想这样做:user.FromJson(value);
我知道如何在 User 类中做到这一点(下面的示例),但我想在抽象类中做到这一点,然后这个方法将适用于我的所有类
不好的方法如何解决它,只需将初始化器添加到类User,就像那里一样:
public User(string jsonString) {
User user = JsonConvert.DeserializeObject<ApiUser>(jsonString);
PublicKey = user.PublicKey;
User_ID = user.User_ID;
}
【问题讨论】:
-
不要这样做。这违反了 SRP。将序列化与模型分开 (
User)。模型必须不知道如何序列化和存储它们。 -
问题是:你为什么要这样做?为什么不直接使用
JsonConvert.DeserializeObject?另一个丹尼斯也提出了一个很好的观点。 -
我同意以前的 cmets。我看不出将序列化作为类本身的一部分有什么好处。在
Get_UserData中,只需直接调用JsonConvert.DeserializeObject。 -
@DennisKuypers @Dennis 有趣的一点,但我只想在需要
Deserialize类的地方简化我的代码。然后在每个类中使用来自 json-string 的自定义反序列化器。在我可以将它用于测试而不是模拟类之后,我将存储一些 json-strings -
@IgorCova 如果不同的类需要自定义序列化,您可以将
JsonConverterAttribute添加到类并指向特定的序列化类来处理这种情况。