2014-09-17 4 views
2

Java에 직렬화되지 않아야하는 값을 나타내는 기본 직렬화와 함께 사용되는 transient 키워드가 있습니다. 그러나 XMLDecoder에서 XML serialization을 사용하면 해당 필드와 관련된 속성이 계속 serialize됩니다. JSON에서 Gson 라이브러리를 사용하여 동일하게 시도했지만 일시적인 필드는 올바르게 건너 뛴 것처럼 보입니다.XMLDecoder가 transient 키워드를 존중하지 않는 이유는 무엇입니까?

왜 그런가?

답변

2

XML 인코더/디코더는 @XMLTransient 주석을 선호합니다.

transient 키워드는 바이트 시퀀스로 끝나는 Java 객체 직렬화 프로세스 용입니다. XML "직렬화"는 형식이 지정된 텍스트 문서로 끝납니다. 필드를 serialize하지 않으려면 (transient으로 표시) 필드를 선택하고 출력이 매우 다르므로 제외하려는 다른 필드를 직접 선택하여 처리하고 싶을 수 있습니다. 예를 들어 자바 직렬화의 경우 쉽고 간단하기 때문에 byte[]을 직렬화하도록 선택할 수 있습니다. XML의 경우 더 좋고/더 의미있는 텍스트 표현이있는 경우 해당 바이트 배열을 만드는 데 사용 된 객체를 직렬화하려고 할 수 있습니다.

@XMLTransientJAXB에 사용됩니다. (source)

BeanInfo info = Introspector.getBeanInfo(JTextField.class); 
PropertyDescriptor[] propertyDescriptors = 
          info.getPropertyDescriptors(); 
for (int i = 0; i < propertyDescriptors.length; ++i) { 
    PropertyDescriptor pd = propertyDescriptors[i]; 
    if (pd.getName().equals("text")) { 
     pd.setValue("transient", Boolean.TRUE); 
    } 
} 

그것은 우아한 해결책이 아니다 : XMLEncoder이 필드를 (일시적으로 표시) 제외 할 경우, 당신은 그들의 PropertyDescriptorTRUE"transient" 속성을 설정해야합니다. 대안은 XMLEncoder 대신 JAXB을 사용하는 것입니다.

+0

그래, 왜? 우리는 이미 저주의 키워드를 가지고 있습니다! – sproketboy

+0

Java 직렬화 및 XML 인코딩에 동일한 클래스를 사용하고자 할 수 있습니다. 1 개의 키워드 또는 제외 된 필드를 표시하는 방법 만있는 경우 2 가지 목적을 위해 차이를 만들 수 없습니다. – icza

+0

XMLEncoder에서는 작동하지 않습니다. – sproketboy