2013-08-02 82 views
3

我知道如何使用Serializable和Streams进行java深层复制,但只要要复制的对象只有原始数据类型即可。在我的情况下,我有一个父类,在原始数据类型中包含一个子类的ArrayList,并且它们也需要被深度复制。链式Java深度复制?

有人能请我指出正确的方向吗?

更新:

我认为这是工作,但我只是意识到它不是。

这就是我所拥有的。

public class Pack implements Serializable 
     { 
     String ID; 
     String serviceCode; 
     String name; 
     String type; 
     ArrayList<Service> services; 
     public Pack deepClone() 
     { 
     try 
      { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(baos); 
      oos.writeObject(this); 

      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
      ObjectInputStream ois = new ObjectInputStream(bais); 
      Pack clone = (Pack) ois.readObject(); 
      clone.setID(null); 
      clone.setType("Replica"); 
      return clone; 
      } 
      catch (IOException e) 
       { 
       return null; 
       } 
      catch (ClassNotFoundException e) 
       { 
        return null; 
       } 
     } 
     } 


public class Service implements Serializable 
    { 
    String ID; 
    String serviceCode; 
    String name; 
    } 

现在克隆一个父类后,得到一个不错的克隆,但是服务数组为空。

更新:

对不起我的错误,这是缺乏睡眠。它确实在起作用。

+2

通过“基本数据类型”你的意思是原语? – arshajii

+0

恩,是的,谢谢,让我解决这个问题。 – Jigzat

+0

你的理解是错误的,它也适用于深层对象 – Yoni

回答

2

只需要确保数组列表的对象还实现序列化的,即你的子类

+0

你能解释一下为什么你不喜欢它? –

+0

这不是我。也许我的问题是重复的,我也收到了投票关闭线程。对不起,我找不到类似的问题。 – Jigzat

+0

我认为它正在工作,但现在我几乎完成了应用程序,我意识到它不是深度复制。我要添加一些代码以便更清楚。 – Jigzat

4

无论您是否具有原始数据类型,都会进行序列化。唯一的条件是你的子类也需要可序列化。

请参考这里的快速教程java_serialization

+0

感谢您的链接,我将检查它。 – Jigzat

+0

矿井也没有明确说明原因... – Tala