2012-06-03 16 views
9

मान लीजिए कि मेरे पास Serializable वर्ग ShapeHolder है जो किसी ऑब्जेक्ट का मालिक है जो SerializableShape इंटरफ़ेस लागू करता है। मैं यह सुनिश्चित करना चाहता हूं कि सही ठोस आकार वस्तु सहेजी गई है (और सही प्रकार बाद में बहाल किया गया है)।मैं एक इंटरफ़ेस को क्रमबद्ध कैसे कर सकता हूं?

मैं इसे कैसे पूरा कर सकता हूं?

interface Shape extends Serializable {} 

class Circle implements Shape { 
    private static final long serialVersionUID = -1306760703066967345L; 
} 

class ShapeHolder implements Serializable { 
    private static final long serialVersionUID = 1952358793540268673L; 
    public Shape shape; 
} 

उत्तर

6

जावा के Serializable आपके लिए अपने आप से करता है।

public class SerializeInterfaceExample { 

    interface Shape extends Serializable {} 
    static class Circle implements Shape { 
     private static final long serialVersionUID = -1306760703066967345L; 
    } 

    static class ShapeHolder implements Serializable { 
     private static final long serialVersionUID = 1952358793540268673L; 
     public Shape shape; 
    } 

    @Test public void canSerializeShape() 
     throws FileNotFoundException, IOException, ClassNotFoundException { 
     ShapeHolder circleHolder = new ShapeHolder(); 
     circleHolder.shape = new Circle(); 

     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test")); 
     out.writeObject(circleHolder); 
     out.close(); 

     ObjectInputStream in = new ObjectInputStream(new FileInputStream("test")); 
     final ShapeHolder restoredCircleHolder = (ShapeHolder) in.readObject(); 
     assertThat(restoredCircleHolder.shape, instanceOf(Circle.class)); 
     in.close(); 
    } 
} 
0
import java.io.*; 

public class ExampleSerializableClass implements Serializable { 
    private static final long serialVersionUID = 0L; 

    transient private Shape shape; 
    private String shapeClassName; 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     shapeClassName = shape.getClass().getCanonicalName(); 
     out.defaultWriteObject(); 
    } 

    private void readObject(ObjectInputStream in) 
      throws IOException, ClassNotFoundException, 
       InstantiationException, IllegalAccessException { 
     in.defaultReadObject(); 
     Class<?> cls = Class.forName(shapeClassName); 
     shape = (Shape) cls.newInstance(); 
    } 
} 
+3

एलेक्सी, यह समाप्त होता है कि जब आप 'सीरियलज़ेल' बढ़ाते हैं तो यह सब काम स्वचालित रूप से किया जाता है। प्रश्न लिखते समय मुझे इसका एहसास नहीं हुआ। मुझे यकीन नहीं है कि क्या आप इसे पहले ही जानते थे और मेरे नौसिखिया प्रश्न से उलझन में थे। –

0

मैं सही मूर्त रूप वस्तु सहेजा जाता है (और सही प्रकार बाद में पुनर्स्थापित किया जाता है) यह सुनिश्चित करना चाहते।

जावा का डिफ़ॉल्ट क्रमबद्धता (ऑब्जेक्ट इनपुटपुट & ऑब्जेक्टऑटपुटस्ट्रीम) उस आउट ऑफ़ द बॉक्स में करता है। जब serializing, जावा वहाँ कंक्रीट वर्ग का नाम लिखता है और फिर deserializing जब उपयोग करता है।

+0

धन्यवाद एस्को, मैंने [आंकड़ा बाहर निकाला] (http://stackoverflow.com/a/10888532/403455) यद्यपि पहिया को फिर से शुरू करने के लिए कई घंटों खर्च करने के बाद भी। :) –

संबंधित मुद्दे

 संबंधित मुद्दे