2011-12-13 3 views
2

직렬화에 대한 많은 경험이 없습니다. 아래 클래스의 간단한 객체를 직렬화하려고 시도하는 동안 YAML 라이브러리에서이 No JavaBean properties found exception을 얻습니다. 여기 snakeyaml을 사용하여 Java에서 객체를 YAML로 직렬화 라이브러리

은 클래스입니다 :

public class MyClass { 
    String value; 
    public MyClass(String args) { 
     value = args; 
    } 

    public String getValue(){ 
     return value; 
    } 
} 

그리고 여기에 내가 SnakeYAMAL 사용하여 직렬화하고 방법입니다

import java.util.HashMap; 
import java.util.Map; 

import org.yaml.snakeyaml.Yaml; 


public class Test { 

    public static void main(String[] args) { 

     MyClass obj = new MyClass("this is my data"); 

     Map<String, Object> data = new HashMap<String, Object>(); 
     data.put("MyClass", obj); 
     Yaml yaml = new Yaml(); 
     String output = yaml.dump(data); 
     System.out.println(output); 
    } 

} 

및 실행시

,이 예외가 발생합니다 :

Exception in thread "main" org.yaml.snakeyaml.error.YAMLException: No JavaBean properties found in MyClass 
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperties(PropertyUtils.java:112) ... 

을 할 수 당신은이 일을하는 데 내가 빠진 것이 무엇인지, 또는 어떻게해야 제대로 할 수 있는지 말해 주시겠습니까?

public class MyClass { 
    String value; 
    public MyClass() {} 

    public String setValue(String value){ 
     this.value = value; 
    } 

    public String getValue(){ 
     return value; 
    } 
} 

하고 내가 그것을 직렬화하기 전에 값을 설정하면, 어떻게 든 작동합니다

편집

. 이것이 적절한 해결책인지 아닌지 생각해보십시오.

답변

9

SnakeYAML은 주로 JavaBeans를 직렬화하기 위해 설계되었습니다.

위 예제는 JavaBean 사양을 따르지 않습니다. JavaBean이 되려면 객체에 인수가없는 생성자가 있어야하며 모든 필드에는 getter와 setter가 있어야합니다.

클래스를 bean으로 다시 작성하면 SnakeYAML은 아무 문제없이 직렬화해야합니다. 또한 SnakeYAML은 공개 필드를 직렬화 할 수 있으므로 value의 가시성을 public으로 변경하면 SnakeYAML이이를 찾고 일련 번호를 지정합니다. 때 문제가 발생할 수 있습니다

PropertyUtils propUtils = new PropertyUtils(); 
propUtils.setAllowReadOnlyProperties(true); 
Representer repr = new Representer(); 
repr.setPropertyUtils(propUtils); 
Yaml yaml = new Yaml(new Constructor(), repr); 

그러나, YAML에 덤핑이 아닌 자바 빈즈 객체 :

당신이 정말로 MyClass을 변경하지 않도록하려는 경우, 당신은 명시 적으로 읽기 전용 속성, 이런 식으로 뭔가를 직렬화 SnakeYAML을 알 수 있습니다 다시 Object으로 역 직렬화하기 때문에 가장 쉽고 안전한 솔루션으로 JavaBeans를 사용하는 것이 좋습니다.

편집

: 여기은 자바 빈즈로 변환 MyClass에의 예입니다

public class MyClass { 
    String value; 

    /* public, no-argument constructor */ 
    public MyClass() { 
    } 

    /* Every field has a public getter... */ 
    public String getValue(){ 
     return value; 
    } 

    /* ... and a public setter */ 
    public void setValue(String value) { 
     this.value = value; 
    } 
} 
+0

당신이 자바 빈즈에이 클래스를 변환하는 아주 작은 examlpe를 추가 할 수 있습니다. – Johnydep

+0

@Johnydep 'MyClass'를 유효한 JavaBean으로 변환하는 예제를 포함하도록 내 대답을 편집했습니다. –

+0

편집 한 코드가 YAML 직렬화를 사용하는 적절한 방법인지 확인할 수 있습니까? 고마워요 – Johnydep