2011-02-15 113 views
3

SimpleXML可以序列化Java Enum罰款,但是當涉及到反序列化時,它會返回null而不是從生成的XML中創建Enum。是否我做錯了Enum序列化根本不被支持?Sourceforge SimpleXML枚舉序列化

序列化的回報是:

<TestStatus> 
    <status>Functional</status> 
</TestStatus> 

測試枚舉:

@Root 
    public enum TestStatus { 

     AVAILABLE("Functional"), 
     NOT_AVAILABLE("Dysfunctional"); 

     @Element 
     private String status; 

     private Status(String status) { 
      this.status = status; 
     } 

     public String getStatus() { 
      return status; 
     } 
    } 
+0

你可以給XML作爲代碼 - 你不必添加和號字符 – 2011-02-15 15:18:18

+0

@Peter,肯定會那樣做,Ta。 – Abidi 2011-02-15 15:22:18

回答

-2

你不需要添加註解枚舉,它們會自動序列化。

2

你如何序列化你的枚舉?

如果你使用它這個樣子,這應該沒有問題,但會返回一些不同的XML:

例子:

@Root 
public class Example 
{ 
    @Element 
    private TestStatus status = TestStatus.AVAILABLE; 

    // ... 
} 

測試:

final File f = new File("test.xml"); 

Serializer ser = new Persister(); 
ser.write(new Example(), f); 

Example m = ser.read(Example.class, f); 

XML:

<example> 
    <status>AVAILABLE</status> 
</example> 

您可以使用annotationarguments重命名xml標籤,但該值不會更改。


另一個(可能的)溶液是用一個定製的轉換器:

枚舉的

註解:

@Root() 
@Convert(TestStatusConverter.class) 
public enum TestStatus 
{ 
    // ... 
} 

轉換器(實施例)

public class TestStatusConverter implements Converter<TestStatus> 
{ 
    @Override 
    public TestStatus read(InputNode node) throws Exception 
    { 
     final String value = node.getNext("status").getValue(); 

     // Decide what enum it is by its value 
     for(TestStatus ts : TestStatus.values()) 
     { 
      if(ts.getStatus().equalsIgnoreCase(value)) 
       return ts; 
     } 
     throw new IllegalArgumentException("No enum available for " + value); 
    } 


    @Override 
    public void write(OutputNode node, TestStatus value) throws Exception 
    { 
     // You can customize your xml here (example structure like your xml) 
     OutputNode child = node.getChild("status"); 
     child.setValue(value.getStatus()); 
    } 
} 

測試(ENUM):

final File f = new File("test.xml"); 

// Note the new Strategy 
Serializer ser = new Persister(new AnnotationStrategy()); 

ser.write(TestStatus.AVAILABLE, f); 
TestStatus ts = ser.read(TestStatus.class, f); 

System.out.println(ts); 

測試(類枚舉):

和上述一樣但AnnotationStrategy