【发布时间】:2016-02-24 03:43:35
【问题描述】:
对象序列化逻辑(字段到 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 方法。他们会声称更简单,更不容易出错。
首选的方法是什么,是否有更好的替代方案来解决这个问题?
【问题讨论】:
-
当标准库(如 JAXB、Jackson 等)存在时,为什么要滚动您自己的序列化逻辑?
-
我同意你的看法。问题是,有时您对可用选项不够熟悉,或者时间有限并且被分配了紧迫的截止日期,或者仅仅是因为从永无止境的选项海洋中找到“正确”的库导致分析瘫痪,并且您决定开始编码会更好。但我同意——没有必要重新发明轮子。
标签: java json design-patterns serialization pojo