2012-02-27 13 views
4

yamlファイルをJavaオブジェクトに逆直列化するためにyamlbeansを使用しています。私はクラスが1つしかない限り、これはうまく動作します。問題は、フィールドをネストしたいときに、yaml記述にネストされたクラスを指定することです。yamlbeansを使用してネストされたクラスを非直列化する

シングルクラス例:

のJava:

public class MessageField { 
    public String name; 
    public String type; 
    public int length; 
    public String comment; 
} 

YAML:

name: field1 
type: int 
length: 4 
comment: first field 
--- 
name: field2 
type: string 
length: 16 
comment: second field 
--- 

複数のクラス(!YAMLファイルにcom.mylib.VariableFieldが必要です)

のJava:

public class MessageField { 
    public String name; 
    public String type; 
    public int length; 
    public String comment; 
    public List<VariableField> variableFields; 
} 
public class VariableField extends MessageField{ 
    public int id; 
} 

YAML:

YamlReader reader = new YamlReader(new FileReader("sample.yml")); 
MessageField mf = reader.read(MessageField.class); 

name: field3 
type: short 
length: 2 
comment: 
variableFields: 
    - !com.mylib.VariableField 
    id: 1 
    name: nestedField 1 
    type: string 
    length: -1 
    comment: 
--- 

のYAMLドキュメントページは、私は私のトップレベルのクラスのために何をすべきかであるクラスを、読むときのタイプを指定してクラスを逆シリアル化する方法について説明しますこれは、トップレベルクラスのフィールドを正しく解析しますが、ネストされたクラスの!com.mylib.VariableField識別子を避けることはできません。私はyamlファイルがクラス名を知る必要がないようにJavaコードを変更する方法があるかどうかを調べようとしています。

答えて

7

私は、あなたが探していることは、コレクションベースのフィールドのデフォルトの要素のタイプを設定します

reader.getConfig().setPropertyElementType(MessageField.class, "variableFields", VariableField.class); 

であると考えています。同様に、setPropertyDefaultTypeメソッドを使用して、フィールド自体のデフォルトの型を指定することもできます。

YamlReaderに指定されたデフォルトのフィールド/エレメントタイプでは、yamlファイルにクラス名を含める必要はなくなりました。ただし、インクルードするタイプ名はこれらのデフォルトを上書きします。また、YamlWriterにデフォルトの型が定義されている場合、余分なクラス名はyamlファイルに書き込まれません。

+0

ありがとう、バットマン。それは完璧に働いた。 –

+0

バットマン、あなたは英雄です:D – pokeRex110

関連する問題