2017-09-22 7 views
0

PropertyChangeSupport 구현 된 내 개체가 있지만 json 문자열에서 deserialize 할 때 변수 propertyChangeSupportnull, 기본 생성자 new PropertyChangeSupport(this) 함께 값을 직접 초기화하는 것입니다. Gson을 사용하여이를 어떻게 초기화하거나 deserialize 할 수 있습니까?JSON (Gson)에서 비 직렬화 할 때 PropertyChangeSupport를 초기화하는 방법은 무엇입니까?

public class Blah implements BlahInterface { 
    private PropertyChangeSupport propertyChangeSupport; 

    protected int id; 
    protected BlahType type; 

    public Blah() { 
     propertyChangeSupport = new PropertyChangeSupport(this); 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public BlahType getType() { 
     return type; 
    } 

    public void setType(BlahType type) { 
     this.type = type; 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     this.propertyChangeSupport.addPropertyChangeListener(listener); 
    } 

    public PropertyChangeListener[] getPropertyChangeListeners() { 
     return this.propertyChangeSupport.getPropertyChangeListeners(); 
    } 
} 

가 나는 또한 시작 부분에 직접 new PropertyChangeSupport(this); 퍼팅 시도하지 않고 하나, 이동 :

내가이 객체를 말해봐. 나 같은 종류의 수동으로 피하기 위해 initializePropertyChangeSupport()과 같은 함수를 피하기 위해 누른 다음 수동으로 deserialization 후 전화 좀 추한. 내가 할 노력하고있어

:

JsonArray ja = json.get("blahs").getAsJsonArray(); 
ja.forEach(item -> { 
    Blah blah = BlahInterface.Parse(item.toString()); 
    // But here I can't addPropertyChangeListener because propertyChangeSupport is null 
    // vvvvvvvvvvvv 
    blah.addPropertyChangeListener(new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 
      BlahState state = (BlahState) evt.getNewValue(); 
      Logger.debug("Property had been updated, " + state.toString()); 
     } 
    }); 
}); 

이 내 JSON 파싱 기능입니다 :

@SuppressWarnings("unchecked") 
public static <T extends Blah> T Parse(String json) { 
    Gson gson = new Gson(); 

    Blah t = new Blah(gson.fromJson(json, Blah.class)); 
    switch (t.getType()) { 
     case blahone: 
      return (T) gson.fromJson(json, BlahOne.class); 
     default: 
      return (T) t; 
    } 
}; 
+0

어디서 알림 방법을 시작합니까? –

+0

또한 오브젝트가 존재하기 전에 리스너를 오브젝트에 어떻게 추가 할 수 있습니까? 정확하게 ** 어떤 속성 ** 속성 변경 청취자가들을 것입니다 -이 클래스의 * bound * 속성 (들)이되어야 할 것인가? 이것이'id' 속성이라면 setter 메소드는 지원 객체의 통지 메소드를 호출해야합니다. –

+0

내 json 객체를 비 직렬화 한 후에 내 'PropertyChangeListener'를 추가합니다. 기본적으로 json 문자열을 서버에서 가져온 다음 해당 데이터로 'Blah' 객체로 비 직렬화 한 다음 내'PropertyChangeListener '를 추가하려고합니다. . 문제는 json 문자열의 일부가 아니기 때문에 변수가 null이라는 것입니다. 그러나 추한 해킹을 피하려고합니다. – codenamezero

답변

0

이 문제의 해결책은 내 객체에 InstanceCreator<T>를 구현하는 것입니다. 따라서 Gson이 객체를 비 직렬화하려고 시도하면 createInstance 함수가 호출되어 PropertyChangeSupport 변수가 초기화 된 올바른 객체를 반환합니다. 아래 예제 코드 :

public class Blah implements InstanceCreator<Blah> { 
    private final transient PropertyChangeSupport pcs = new PropertyChangeSupport(this); 

    ... 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     this.pcs.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     this.pcs.removePropertyChangeListener(listener); 
    } 

    @Override 
    public Blah createInstance(Type type) { 
     return new Blah(); 
    } 
} 

참고 : GSON 그렇지 않으면 GSON이 예외를 슬로우 직렬화 과정을 생략하는 것과 있도록 과도 키워드가 거기 pcs에 있습니다.