2010-09-22 60 views
5

我有一個實現了Parcelable的類。我可以這樣做下面創建一個類?:的新實例使用包來克隆一個對象?

Foo foo = new Foo("a", "b", "c"); 

Parcel parcel = Parcel.obtain(); 
foo.writeToParcel(parcel, 0); 
Foo foo2 = Foo.CREATOR.createFromParcel(parcel); 

我想foo​​2的是富的克隆。

---------------------- update ----------------------- --------

上述不起作用(所有Foo成員在新實例中都爲null)。我在活動之間傳遞Foos很好,所以Parcelable接口實現正常。使用下面的其中工程:

Foo foo1 = new Foo("a", "b", "c"); 
Parcel p1 = Parcel.obtain(); 
Parcel p2 = Parcel.obtain(); 
byte[] bytes = null; 

p1.writeValue(foo1); 
bytes = p1.marshall(); 

p2.unmarshall(bytes, 0, bytes.length); 
p2.setDataPosition(0); 
Foo foo2 = (Foo)p2.readValue(Foo.class.getClassLoader()); 

p1.recycle(); 
p2.recycle(); 

// foo2 is the same as foo1. 

發現這個從下面問:How to use Parcel in Android?

這是工作好了,我可以用這個去,但它是額外的代碼,不知道是否有一個較短的方式做它(除了正確實現複製構造函數...)。

感謝

回答

0

是,假設你的包裹實施正確的寫入和讀取所有的富變量,應該創建一個克隆的。

+0

嗯是的它不會,但 - 我只是得到了一個Foo對象,但它的所有成員都是空的。雖然我在活動之間傳遞了Foo實例。我使用了另一個似乎可行的Q代碼片段,更新了上述問題。 – user291701 2010-09-22 20:43:29

+0

啊,對不起,我沒有真正檢查代碼的有效性,只是在概念上它的possbile。但是,如果你做了很多工作,複製構造函數肯定會更有效率。 – 2010-09-22 20:59:23

14

有一個較短的方式:

Foo foo1 = new Foo("a", "b", "c"); 
Parcel p = Parcel.obtain(); 
p.writeValue(foo1); 
p.setDataPosition(0); 
Foo foo2 = (Foo)p.readValue(Foo.class.getClassLoader()); 
p.recycle(); 
7

我有同樣的問題,這裏是我的解決方案:

Parcel p = Parcel.obtain(); 
foo.writeToParcel(p, 0); 
p.setDataPosition(0); // <-- this is the key 
Foo foo2 = Foo.CREATOR.createFromParcel(p); 
p.recycle();