我想知道在Android项目和后端项目中共享相同POJO的最佳方式是什么。
当我在后端有POJO时,这个POJO有Hibernate和Jackson注释。在课堂的顶部有HQL句子,如@NameQueries。当我在Android项目中需要相同的POJO时,复制POJO并删除所有注释。目前,我在Android项目中使用GSON。
所以我的问题是,当我在后端创建新的POJO,并且我在Android项目中也需要它时,什么是摆脱这种乏味工作的最佳方法。
到目前为止,我已经考虑过创建lib项目,但还没有弄清楚如何控制注释。在Android方面,我也可以使用Jackson,但我想去掉Hibernate的东西。
我想GSON将是您的最佳选择。但请注意,在具有关系(一对多、多对多)的休眠中,由于在解析为json时调用字段的get
方法,您需要指示字段是应急切地提取还是应懒散地提取,因此可能会导致错误。如果你不需要android中的字段,你可以在后台的pojo中使用@Expose
注释来指示哪些字段只应该公开或转换为json。我认为@Expose
只在谷歌的json 中可用
还建议看看Jackson,它是两个最流行的JSON读/写库之一(上面提到了另一个GSON)。
与Jackson的双向参考:http://wiki.fasterxml.com/JacksonFeatureBiDirReferences
循环参考:Json和Java-循环参考
还有自定义序列化程序和反序列化程序等功能。
最好的方法是使用序列化"scheme"(因为没有更好的词)将您的POJO序列化为可由Android解组的序列化流。
现代编程技术中使用的最常见的格式是JSON,因此使用JSON,您可以创建一个服务,将您的POJO呈现为JSON对象,并且您的Android应用程序将其从JSON反序列化为POJO。
服务可以是Restful Web服务,也可以创建一个将POJO呈现为JSON的自定义服务。
Java7现在包括JSR-353、JSON处理(简称JSON-p),这为您提供了各种功能和类来提供JSON编组和解编组。一个简单的教程可以在这里找到。
在您的Android应用程序中,您可以使用GSON进行JSON解组。
我希望这能有所帮助。
我可以看到在两者之间共享这些POJO的吸引力,但我认为最好的选择是在共享库中创建一组简单的DTO,并从后端和android使用这些。在两个项目中拥有相同的实际域对象的问题正是您所描述的——您在它们中做的是不属于前端的后端类型的事情。
客户的一个简单例子(这种模式与构建器模式有一些交叉,因此您可以重用构建器中的这些DTO):
//this is your back end "proper" domain object
class Customer
{
<back end specifics>
...
Customer(CustomerDTO customer)
{
//set Customer fields from the dto
}
CustomerDTO toDTO()
{
CustomerDTO dto = new CustomerDTO();
dto.setName(this.getName());
dto.setAddress(this.getAddress());
...
return dto;
}
}
然后,您的DTO将是共享库中的一个简单版本,不需要Jackson注释,因为它将自动默认为只包含您在客户端上想要的内容。正如您所说,如果您确实需要一些Jackson注释,那么在Android方面也没问题。这是你从后端发回的DTO:
public class CustomerDTO
{
private String mName;
public String getName()
{
return mName;
}
...
}
虽然这仍然会导致重复(在正确的域对象和DTO之间),但这确实意味着,如果您在后端更改任何内容,它也必须在DTO中更改,以便客户端看到,因此客户端保持同步,因为它使用相同的DTO。