2011-04-13 6 views
7

की बजाय खाली स्ट्रिंग पर खाली तत्व को deserializing, मैं अपने serializing/deserializing जरूरतों के लिए एक परियोजना में simpleframework (http://simple.sourceforge.net/) का उपयोग करता हूं, लेकिन यह अपेक्षित के रूप में काम नहीं करता है (ठीक है, कम से कम मैं कैसे उम्मीद करता हूं) खाली/शून्य स्ट्रिंग मानों से निपटने पर।सरल फ्रेमवर्क, शून्य

यदि मैं किसी रिक्त स्ट्रिंग मान वाले ऑब्जेक्ट को क्रमबद्ध करता हूं, तो यह एक खाली xml तत्व के रूप में दिखाया जाएगा।

तो यह
MyObject object = new MyObject();
object.setAttribute(""); // attribute is String

को क्रमानुसार के रूप में
<object>
<attribute></attribute>
</object>

लेकिन deserializing कि खाली विशेषता अशक्त के रूप में खत्म हो जाएगा, एक खाली स्ट्रिंग के बजाय।

क्या मैं सोचने के लिए पूरी तरह से बोनर हूं कि यह शून्य के बजाय खाली स्ट्रिंग होना चाहिए? और मैं पृथ्वी पर कैसे काम कर सकता हूं जिस तरह से मैं काम नहीं कर सकता?

ओह, और यदि मैं ऑब्जेक्ट को शून्य विशेषता के साथ क्रमबद्ध करता हूं तो यह <object/> दिखा सकता है जैसा कि कोई उम्मीद कर सकता है।

संपादित करें:

जोड़ा गया एक सरल testcase मैं currenty

@Test 
public void testDeserialization() throws Exception { 
    StringWriter writer = new StringWriter(); 
    MyDTO dto = new MyDTO(); 
    dto.setAttribute(""); 

    Serializer serializer = new Persister(); 
    serializer.write(dto, writer); 

    System.out.println(writer.getBuffer().toString()); 

    MyDTO read = serializer.read(MyDTO.class, writer.getBuffer().toString(),true); 
    assertNotNull(read.getAttribute()); 
} 


@Root 
public class MyDTO { 
    @Element(required = false) 
    private String attribute; 

    public String getAttribute() { 
     return attribute; 
    } 

    public void setAttribute(String attribute) { 
     this.attribute = attribute; 
    } 
} 

संपादित चल रहा हूँ, फिक्स्ड:

किसी कारण से कोई रिक्त स्ट्रिंग यह करने के लिए पारित हो जाता है जब InputNode मान शून्य है । मैंने स्ट्रिंग के लिए कस्टम कन्वर्टर बनाकर समस्या का समाधान किया।

new Converter<String>() { 

    @Override 
    public String read(InputNode node) throws Exception { 
     if(node.getValue() == null) { 
      return ""; 
     } 
     return node.getValue(); 
    } 

    @Override 
    public void write(OutputNode node, String value) throws Exception { 
     node.setValue(value); 
    } 

}); 

उत्तर

10

पूर्णता

के लिए उत्तर देना परिवर्तित एनोटेशन के साथ अपने तत्व पर टिप्पणी करें और यह एक कनवर्टर वर्ग एक पैरामीटर @Convert(SimpleXMLStringConverter.class)

कनवर्टर वर्ग कि रिक्त स्ट्रिंग पर अशक्त से स्ट्रिंग रूपांतरण करता है बनाएँ के रूप में देने के

public class SimpleXMLStringConverter implements Converter<String> { 


    @Override 
    public String read(InputNode node) throws Exception { 
     String value = node.getValue(); 
     if(value == null) { 
      value = ""; 
     } 
     return value; 
    } 

    @Override 
    public void write(OutputNode node, String value) throws Exception { 
     node.setValue(value); 
    } 

} 

और अपने persister के लिए new AnnotationStrategy() जोड़ने के लिए मत जाओ।

+0

बहुत बहुत धन्यवाद !!! – Boy

+0

यह एक आकर्षण की तरह काम करता है –

1

गुण एनोटेशन का प्रयोग करें। इसमें एक डिफ़ॉल्ट मूल्य प्रदान करने के लिए खाली नाम की एक संपत्ति है।

देखें Simple Framework Javadocs.

+0

यदि मैं सही ढंग से समझ गया, तो @ एट्रिब्यूट एनोटेशन xml तत्व के लिए एक विशेषता बनाता है, इसलिए यह तत्व को स्वयं प्रभावित नहीं करता है। – Sand

-1

हूँ मैं पूरी तरह से यह सोच कर कि यह बजाय एक खाली स्ट्रिंग शून्य होना चाहिए के लिए bonkers?

जहां तक ​​मुझे पता नहीं है ... आम तौर पर यह सीरियलाइजेशन के साथ कुछ समस्या को इंगित करता है, यह ऑब्जेक्ट को वापस करने और सीरियलाइजेशन पर सेट मानों के साथ इसके सभी क्षणिक आवृत्ति चर को वापस करने वाला है।

बीटीडब्ल्यू आपने अपना पूरा कोड पोस्ट नहीं किया है, यह भी संभव है कि जिस क्रम में सीरियलाइजेशन शुरू होता है, वह स्ट्रिंग डेटा को छोड़ देता है, यह कभी-कभी समस्या हो सकता है।

+0

तो यह इनपुट नोड था जिसके कारण यह पता चला, टीएक्स, जानने में मददगार :) – Selenia