2010-03-30 37 views
4

我有关于Java自定义序列化的问题。我有一个对象图,并且想要配置从客户端到服务器的序列化根对象的位置。序列化对象图的一部分

让我们通过给出一个示例场景来明确一点。我有型

的类公司
员工(摘要)
Manager将员工
秘书延伸员工
分析师延长员工
项目

这里有关系:
公司(1) - - (n)员工
经理(1)---(n)项目
分析员(1)---(n)项目

想象一下,我在客户端,我想创建一个新公司,将其分配给10名员工(新的或现有的),并将此新公司发送给服务器。在这种情况下我期望的是将公司和所有绑定员工序列化到服务器端,因为我将把关系保存在数据库中。到目前为止没有问题,因为默认的Java序列化机制将整个对象图序列化,不包括静态或瞬态的字段。

我的目标是关于以下情况。想象一下,我将一家公司及其1000名员工从服务器加载到客户端。现在我只想重命名公司的名称(或其他字段,直接属于公司)并更新此记录。这一次,我只想将公司对象发送到服务器端,而不是将所有员工列表(我只是更新名称,员工在这个用例中不相关)。我的目标还包括说,转移公司和员工而不是项目关系的可配置性,您必须在那里停止。

您是否知道以通用方式实现此操作的可能性,而无需为每个实体对象实现writeObject,readObject?你的建议是什么?

我真的很感激你的答案。我愿意接受任何想法,并准备在出现问题时回答您的问题。

回答

1

您可以创建另一个类(数据传输对象),其中只有要传输的字段。

自定义序列化的方式实现Externalizable

+0

Bozho您好,感谢您的快速答复。我认为DTO解决方案是一个很好的解决方案。这是为了节省维护代码的时间,DTO和DO的单独重复而设计的。我们目前正处于这样一个阶段,如果没有DTO整合,问题必须解决。否则需要很多时间,因为我们在客户端有一个缓存,必须根据DTOs这次更新等。 – Max 2010-03-30 12:28:53

0

我会说简短的回答你的问题是没有,序列化等不同的逻辑不容易,而无需编写自己的序列化实现。也就是说,替代方案可能是编写几个序列化器/解串器对(XML,JSON,不管你喜欢的格式,而不是标准的内置序列化)。然后通过那些发送某种元信息序言的对来运行你的对象。

例如下面的场景你上面可能有这些对(德)序列化机制

  1. (DE)serializeCompany(C公司) - 为基础的公司信息
  2. (DE)serializeEmployee(员工E) - 对于一个职工的信息
  3. (DE)serializeEmployee(C公司) - 员工在公司的基本信息
  4. (DE)serializeRelationships(C公司) - 为项目关系

对于XML每一种可生成一个DOM树,然后将它们全部含元信息根节点即

<Company describesEmployees="true" describeRelationships="false"> 
[Elements from (de)serializeCompany] 
[Elements from (de)serializeEmployee(Company c)] 
</Company> 

一个潜在的“疑难杂症”这种做法是确保你做反序列化正确的顺序取决于你的模型(即确保你先反序列化公司,然后是员工,然后是关系)。但是这种方法应该让你能够只写一次“实际”序列化,然后你可以根据这些作品的组合构建不同的传输模型。

0

您可以采用对象调整方法,通过电线将“存根”对象发送到客户端。

优点

  • 相同的对象图是逻辑上可用的客户端侧,而不序列化/反序列化不必要的数据的开销。
  • 完整/存根实现可以根据需要进行交换,而不必更改客户端代码。

缺点

  • 呼吁干将的开销,这导致通过对服务器的呼叫从客户端隐藏的,这是有问题的,如果你不控制客户端动态加载额外的属性码;例如一个不知情的用户可能会在紧密的循环中多次拨打昂贵的电话。
  • 如果您决定在客户端本地缓存数据,则需要确保其与服务器保持同步。

/** 
* Lightweight company stub that only serializes the company name. 
* The collection of employees is fetched on-demand and cached locally. 
* The service responsible for returning employees must be "installed" 
* client-side when the object is first deserialized. 
*/ 
public class CompanyStub implements Company, Serializable { 
    private final String name; 
    private transient Set<Employee> employees; 
    private Service service; 

    public Service getService() { 
    return service; 
    } 

    public void setService(Service service) { 
    this.service = service; 
    } 

    public String getName() { 
    return name; 
    } 

    public Set<? extends Employee> getEmployees() { 
    if (employees == null) { 
     // Employees not loaded so load them now. 
     this.employees = server.getEmployeesForCompany(name); 
    } 

    return employees; 
    } 
}