gpt4 book ai didi

java - 序列化逻辑应该在实体还是其他类中

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:50 26 4
gpt4 key购买 nike

对象序列化逻辑(将字段映射到 XML 或 JSON 名称和值)应该放在哪里?在每个实体对象内部或进入一组只与序列化有关的不同类?还有其他与此问题相关的最佳做法吗?

例如:

class Person {
String name;
}

有些人是这样处理的:

class Person {
String name;
public String toJson () {
// build JSON, use 'name' field
}
}

但是,如果我们还需要 toXML()、toCSV()、toXYZ(),保持该方向将产生可怕的污染代码并破坏单一职责原则,即使使用单个 toJson 方法,单一职责原则已经被打破,恕我直言。

另一种选择,这是我通常做的:

interface Serializer {  public String toJson (); }

class PersonJsonSerializer implements Serializer {
private Person p;
public PersonJsonSerializer (Person p) { this.person = p; }
public String toJson () {
// build JSON, use p.name
}
}

然后工厂根据实体类型分发序列化程序:

class JsonSerializerFactory {
public Serializer getSerializer (Object o) {
if (o instanceof Person) {
return new PersonJsonSerializer ((Person)o);
}
else if (o instanceof Account) {
return new AccountJsonSerializer ((Account)o);
}
// ... etc
}
}

还有 XMLSerializerFactory、CSVSerializerFactory 等等。

然而,大多数时候人们希望完全控制序列化,不会接受它,而更喜欢在每个类中使用 toJson 方法。他们会声称更简单,更不容易出错。

首选的方法是什么?是否有更好的替代方法来解决这个问题?

最佳答案

出于多种原因,我认为序列化逻辑不应成为 POCO/数据类的一部分:

  1. 单一职责原则(数据类应该只定义数据模型,注意序列化逻辑)
  2. 您可能需要不同类型的序列化程序(您提到的 json/xml 等)
  3. 大多数时候序列化实现是通用解决方案或外部包。即使您想要对某些对象进行自定义实现,您仍然可以拥有一个可以针对特定类进行扩展的通用解决方案,因此无需为每个类都使用它。
  4. 您可以使用属性装饰您的 POCO 类,以针对特殊情况引导序列化程序(例如控制属性序列、属性名称,甚至是复杂类型属性的客户序列化程序)

还有其他原因,但有一些强有力的论据表明您不应该将序列化逻辑放入您的 POCO/数据模型中。

关于java - 序列化逻辑应该在实体还是其他类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com