2010-09-22 104 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();