2014-05-21 1 views
0

클러스터 노드간에 jgroups 트래픽을 최소화하기 위해 객체를 생략하는 자바 직렬화 (readObjectwriteObject 통해)를 사용자 정의했지만 xstream에 의해 생성/소비 된 xml에서 해당 속성을 생략하고 싶지 않습니다. xstream에 의해 사용되는 자바 직렬화를 제어 할 수있는 방법이 있나요? 이러한 속성을 생략하지 않으시겠습니까?xstream에서 객체의 readObject/writeObject 구현을 사용하지 않으려면 어떻게해야합니까?

답변

0

편집는 : 죄송합니다, 나는 당신이 필드를 생략하고 싶지 할 질문을 오해. 데이터 모델이 Serializable을 구현하고 readObjectwriteObject 방법이있는 경우

, 이러한 방법은 SerializationMethodInvoker#callReadObjectSerializationMethodInvoker#callWriteObject하여보다 정확한 XStream을에 의해 자동으로 호출 또는됩니다. 이러한 호출을 피하기 위해 어떤 구성 플래그도 표시되지 않았습니다.

또한 과도 필드는 자동으로 생략됩니다. AbstractReflectionConverter#shouldUnmarshalField 참조 :

protected boolean shouldUnmarshalField(final Field field) { 
     return !(Modifier.isTransient(field.getModifiers()) && !shouldUnmarshalTransientFields()); 
} 

protected boolean shouldUnmarshalTransientFields() { 
    return false; 
} 

을 그래서 피할 수없는 구성 플래그가없는 shouldUnmarshalTransientFields 반환 할 때마다 false 그;

XSream을 사용하여 필드를 생략하는 방법은 여러 가지가 있습니다. 그것을 위해 자바의 구문을 사용 XStream#omitField(Class definedIn, String fieldName)

  • : @XStreamOmitField
  • 통해이 XStream을 개체를 구성 :

      주석 통해
    1. transient Type field
  • 0

    문제의 클래스, 양식, Serializable을 구현 않습니다와 readObject있다 및 writeObject.

    매우 기본적인 변환기 클래스를 등록하고 내가 toXML을 호출했을 때 writeObject가 호출되지 않았다는 것을 발견했습니다. 나는 겉으로보기에 내가 찾고있는 것입니다. 이제는 xtream 생성 xml에서 생략되지 않는 jgroups 직렬화 스트림 (writeObject 통해)의 특정 속성을 생략 할 수 있습니다.

    여기 내 변환기 클래스의 ...

    package foo.form; 
    
    import com.thoughtworks.xstream.converters.MarshallingContext; 
    import com.thoughtworks.xstream.converters.UnmarshallingContext; 
    import com.thoughtworks.xstream.converters.javabean.JavaBeanConverter; 
    import com.thoughtworks.xstream.io.HierarchicalStreamReader; 
    import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 
    import com.thoughtworks.xstream.mapper.Mapper; 
    
    public class FormConverter extends JavaBeanConverter { 
    
        public FormConverter(Mapper mapper) { 
         super(mapper); 
        } 
    
        @Override 
        public boolean canConvert(Class clazz) { 
         return Form.class == clazz; 
        } 
    
        @Override 
        public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
         super.marshal(source, writer, context); 
        } 
    
        @Override 
        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
         return super.unmarshal(reader, context); 
        } 
    } 
    
    관련 문제