2010-03-30 4 views
4

Java 사용자 지정 serialization 관련 문제가 있습니다. 객체의 그래프를 가지고 있고 클라이언트에서 서버로 루트 객체를 직렬화 할 때 어디서 멈추는 지 구성하려고합니다.개체 그래프의 일부를 serialize

예제 시나리오를 작성하여 명확하고 명확하게 만들어 보겠습니다. 내가 유형

의 클래스 회사
이 직원 (추상)
관리자가 확장 직원
장관은 직원
분석이 여기에 관계가있는 직원
프로젝트

확장 확장 :
회사 (1) - - (n) 종업원
관리자 (1) --- (n) 프로젝트
애널리스트 (1) --- (n) 프로젝트

저는 클라이언트 측에서 새로운 회사를 만들고 10 명의 직원 (신규 또는 기존)을 할당하고이 새로운 회사를 서버에 보내고 싶습니다. 이 시나리오에서 기대하는 것은 회사와 모든 경계 직원을 서버 측에 직렬화하는 것입니다. 관계를 데이터베이스에 저장하기 때문입니다. 기본 Java 직렬화 메커니즘은 정적 또는 일시적인 필드를 제외한 전체 객체 그래프를 직렬화하기 때문에 아무런 문제가 없습니다.

내 목표는 다음 시나리오에 대한 것입니다. 상상해보십시오. 회사와 1000 명의 직원을 서버에서 클라이언트 측으로로드했습니다. 이제 회사 이름 (또는 회사에 직접 속한 다른 필드)의 이름을 바꾸고이 레코드를 업데이트하기 만하면됩니다. 이번에는 회사 개체 만 서버쪽에 보내고 전체 직원 목록은 보내지 않고 싶습니다. (이름을 업데이트하면 직원들이이 용도에 적합하지 않습니다.) 내 목표는 또한 회사와 직원을 양도 할 수는 있지만 Project-Relations는 양도 할 수 없도록 구성 할 수 있다는 점을 포함합니다.

모든 단일 Entity-Object에 대해 writeObject, readObject를 구현하지 않고 일반적인 방법으로이 작업을 수행 할 수 있는지 알고 있습니까? 당신의 제안은 무엇입니까?

정말 감사드립니다. 나는 어떤 아이디어라도 열어두고 명확하지 않은 질문에 답할 준비가되어 있습니다.

답변

1

전송할 필드가있는 다른 클래스 (데이터 전송 개체)를 만들 수 있습니다.

사용자 정의 직렬화의 방법은 내가 귀하의 질문에 짧은 대답은 '아니, 직렬화와 같은 다양한 논리가 쉽게 직렬화를 직접 작성하지 않고도 구현 될 수 없다 말할 것 Externalizable

+0

안녕 Bozho, 빠른 답변 감사합니다. 나는 DTO 솔루션이 좋은 것이라고 생각한다. 이것은 코드 유지 보수 시간을 줄이기 위해 설계되었으므로 DTO와 DO에 대한 복제본을 따로 보관합니다. 우리는 현재 DTO 통합없이 문제를 해결해야하는 단계에 있습니다. 그렇지 않으면 우리는 클라이언트에 캐시를 가지고 있으므로, 이번에는 DTO에 따라 업데이트되어야합니다. – Max

0

을 구현한다. 즉, 직렬화/직렬화 (XML, JSON)를 작성하는 것이 대안이라고 할 수있다. 그런 다음 어떤 종류의 메타 정보 프리앰블을 보내는 쌍을 통해 객체를 실행해야합니다.예를 들어

당신이 (비) 직렬화 메커니즘

  1. (드) serializeCompany (기업 C)의이 쌍을 가질 수있다 위의 시나리오를 다음 - 기본 회사 정보
  2. (드) serializeEmployee (직원에 대한 E) - 직원의 정보
  3. (드) serializeEmployee (기업 C) - 회사 직원의 기본 정보
  4. (드) 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; 
    } 
} 
관련 문제