2010-09-22 2 views
5

У меня есть класс, который реализовал Parcelable. Могу ли я сделать что-то вроде следующее, чтобы создать новый экземпляр класса ?:Использование паркета для клонирования объекта?

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

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

я хотел foo2 быть клоном обув.

---------------------- обновление ----------------------- --------

Вышеприведенное не работает (все члены Foo равны нулю в новом экземпляре). Я передаю 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

Да, при условии, что ваша реализация посылки правильно пишет и читает все переменные в Foo, которые должны создать клон.

+0

Хм, да это не хотя - я просто получить объект Foo, но все его члены равны нулю. Тем не менее, я пропускаю экземпляры Foo между действиями. Я использовал фрагмент из другого Q, который, похоже, работает, обновляя вышеуказанный вопрос. – user291701

+0

Ах, извините, я действительно не проверял достоверность кода, просто по понятию его возможно. Однако конструктор копирования определенно будет более эффективным, если вы сделаете это много. –

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(); 
Смежные вопросы