Dlaczego Android zapewnia 2 interfejsy do serializacji obiektów? Czy obiekty Binder
nadające się do serializacji współpracują z plikami Androida i AIDL?
źródło
Dlaczego Android zapewnia 2 interfejsy do serializacji obiektów? Czy obiekty Binder
nadające się do serializacji współpracują z plikami Androida i AIDL?
W Androidzie nie możemy po prostu przekazywać obiektów do działań. Aby to zrobić, obiekty muszą zostać zaimplementowane Serializable
lub Parcelable
interfejs.
Serializowalny
Serializable
to standardowy interfejs Java. Możesz po prostu zaimplementować Serializable
interfejs i dodać metody zastępowania. Problem z tym podejściem polega na tym, że stosuje się refleksję i jest to proces powolny. Ta metoda tworzy wiele tymczasowych obiektów i powoduje sporo śmiecia. Jednak Serializable
interfejs jest łatwiejszy do wdrożenia.
Spójrz na poniższy przykład (Serializable):
// MyObjects Serializable class
import java.io.Serializable;
import java.util.ArrayList;
import java.util.TreeMap;
import android.os.Parcel;
import android.os.Parcelable;
public class MyObjects implements Serializable {
private String name;
private int age;
public ArrayList<String> address;
public MyObjects(String name, int age, ArrayList<String> address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public ArrayList<String> getAddress() {
if (!(address == null))
return address;
else
return new ArrayList<String>();
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");
// Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getSerializableExtra("UniqueKey");
Paczka
Parcelable
proces jest znacznie szybszy niż Serializable
. Jednym z powodów tego jest to, że mówimy wprost o procesie serializacji zamiast używać refleksji do wnioskowania. Ma również uzasadnienie, że kod został mocno zoptymalizowany do tego celu.
Spójrz na poniższy przykład (działki):
// MyObjects Parcelable class
import java.util.ArrayList;
import android.os.Parcel;
import android.os.Parcelable;
public class MyObjects implements Parcelable {
private int age;
private String name;
private ArrayList<String> address;
public MyObjects(String name, int age, ArrayList<String> address) {
this.name = name;
this.age = age;
this.address = address;
}
public MyObjects(Parcel source) {
age = source.readInt();
name = source.readString();
address = source.createStringArrayList();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
dest.writeStringList(address);
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public ArrayList<String> getAddress() {
if (!(address == null))
return address;
else
return new ArrayList<String>();
}
public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
@Override
public MyObjects[] newArray(int size) {
return new MyObjects[size];
}
@Override
public MyObjects createFromParcel(Parcel source) {
return new MyObjects(source);
}
};
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");
// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelableExtra("UniqueKey");
Możesz przekazać ArrayList
obiekty do paczkowania, jak poniżej:
// Array of MyObjects
ArrayList<MyObjects> mUsers;
// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");
Wniosek
Parcelable
jest szybszy niż Serializable
interfejsParcelable
Interfejs wymaga więcej czasu na wdrożenie niż Serializable
interfejsSerializable
interfejs jest łatwiejszy do wdrożenia Serializable
Interfejs tworzy wiele tymczasowych obiektów i powoduje sporo śmieciaParcelable
tablica może być przekazywana przez Intent w Androidzie
Serializable to standardowy interfejs Java. Po prostu zaznaczasz klasę Serializable, implementując interfejs, a Java automatycznie serializuje ją w określonych sytuacjach.
Parcelable to interfejs specyficzny dla Androida, w którym samodzielnie wdrażasz serializację. Został stworzony, aby być znacznie bardziej wydajnym niż Serializable i ominąć niektóre problemy z domyślnym schematem serializacji Java.
Uważam, że Binder i AIDL współpracują z obiektami paczkowalnymi.
Jednak można używać obiektów Serializowalnych w Intentach.
źródło
Paczkowany vs Serializowalny Odnoszę te dwa.
Dla Javy i Kotlin
1) Java
Serializowalny, prostota
Zaletą serializacji jest to, że wystarczy zaimplementować interfejs Serializable na klasie i jej dzieciach. Jest to interfejs znaczników, co oznacza, że nie ma metody implementacji, Java po prostu dołoży wszelkich starań, aby skutecznie serializować go.
Problem z tym podejściem polega na tym, że stosuje się refleksję i jest to proces powolny. Mechanizm ten ma również tendencję do tworzenia wielu tymczasowych obiektów i powodowania sporo śmieci.
Przesyłki, prędkość
Teraz zwycięzcą jest
Wyniki testów przeprowadzonych przez Philippe'a Breaulta pokazują, że paczka jest ponad 10 razy szybsza niż Serializable. Za tym stwierdzeniem stoją także inni inżynierowie Google.
Stop Stop !!!!, przed podjęciem decyzji
A teraz porównanie między Paczkową a niestandardową Serializowalną wydaje się uczciwe! Wyniki mogą być zaskakujące! Niestandardowe podejście do szeregowania jest ponad 3-krotnie szybsze w przypadku zapisów i 1,6 razy szybsze w przypadku odczytów niż w przypadku paczek.
Edytowano: -----
2) Serializacja Kotlinx
Biblioteka Serialization Kotlinx
Twój
build.gradle
plikSerializacja odbywa się dość łatwo, należy opisać klasę przeznaczoną do niej
@Serializable
adnotacją jak poniżejDwie dodatkowe adnotacje do odnotowania to
transient
ioptional
. Użycie przejściowego spowoduje, że serializator zignoruje to pole, a użycie opcjonalnego pozwoli serializatorowi nie pęknąć, jeśli brakuje pola, ale jednocześnie należy podać wartość domyślną.Uwaga : Może to również działać z klasami danych.
Po więcej
źródło
Serialization
, zobacz.Źródło do tego punktu: http://www.developerphil.com/parcelable-vs-serializable/
źródło
W Parcelable programiści piszą niestandardowy kod do zestawiania i rozpakowywania, dzięki czemu tworzy mniej obiektów śmieciowych w porównaniu do serializacji. Wydajność paczki nad serializacją znacznie się poprawia (około dwa razy szybciej) z powodu tej niestandardowej implementacji.
Serializable to interfejs znaczników, co oznacza, że użytkownik nie może gromadzić danych zgodnie z ich wymaganiami. W serializacji operacja zestawiania jest wykonywana na wirtualnej maszynie Java (JVM) przy użyciu interfejsu API refleksji Java. Pomaga to zidentyfikować element członkowski i zachowanie obiektu Java, ale także powoduje powstanie wielu śmieci. Z tego powodu proces serializacji jest powolny w porównaniu do paczkowanego.
Edycja: Jakie znaczenie ma rozebranie i rozebranie?
W kilku słowach „marshalling” odnosi się do procesu konwersji danych lub obiektów w strumień bajtów, a „unmarshalling” jest odwrotnym procesem konwersji beack strumienia bajtów na ich oryginalne dane lub obiekt. Konwersja odbywa się poprzez „serializację”.
http://www.jguru.com/faq/view.jsp?EID=560072
źródło
Właściwie to będę jedyną osobą, która będzie promować Serializable. Różnica prędkości nie jest już tak drastyczna, ponieważ urządzenia są znacznie lepsze niż kilka lat temu, a także istnieją inne, bardziej subtelne różnice. Aby uzyskać więcej informacji, zobacz mój blog na ten temat.
źródło
Paczkowany jest swego rodzaju standardem w rozwoju Androida. Ale nie z powodu prędkości
Przesyłki zalecane są do przesyłania danych. Ale jeśli użyjesz serializowalnego poprawnie, jak pokazano w tym repozytorium , zobaczysz, że serializowalność jest czasem nawet szybsza niż pakowalna. Lub przynajmniej czasy są porównywalne.
Czy paczka jest szybsza niż seryjna?
Jeśli więc serializacja jest szybsza i łatwiejsza do wdrożenia, to dlaczego android ma w ogóle paczkę?
Powodem jest kod macierzysty. Paczka jest tworzona nie tylko do komunikacji międzyprocesowej. Może być również używany do komunikacji między kodami . Możesz wysyłać i odbierać obiekty z macierzystej warstwy C ++. Otóż to.
Co wybrać Oba będą działać dobrze. Ale myślę, że Parcelable jest lepszym wyborem, ponieważ jest polecany przez Google i jak widać z tego wątku, jest o wiele bardziej doceniany.
źródło
1. Serializowalny
@ patrz http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
Interfejs czego?
Prędkość
2. Paczkowany
@ patrz http://developer.android.com/reference/android/os/Parcelable.html
Interfejs czego?
Prędkość
> Podsumowując
Należy pamiętać, że Serializable to standardowy interfejs Java, a Parcelable jest przeznaczony do programowania na Androida
źródło
Występuje pewien problem z wydajnością w odniesieniu do zestawiania i rozpakowywania. Paczkowany jest dwa razy szybszy niż Serializowalny.
Proszę przejść przez następujący link:
http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development
źródło
Wdrożenie paczki może być szybsze, jeśli użyjesz wtyczki Paracelable w Android Studio. wyszukaj generator kodu działki na Androida
źródło
Interfejs Serializable może być używany w ten sam sposób, co interfejs Parcelable, co daje (niewiele) lepsze wyniki. Wystarczy zastąpić te dwie metody obsługi ręcznego zestawiania i rozpakowywania:
Wydaje mi się jednak, że przy opracowywaniu natywnego Androida, najlepszym rozwiązaniem jest użycie interfejsu API Androida.
Widzieć :
źródło
Spóźniam się z odpowiedzią, ale piszę z nadzieją, że pomoże to innym.
Jeśli chodzi o szybkość ,
Parcelable > Serializable
. Ale niestandardowe serializowanie jest wyjątkiem. Jest prawie w zasięgu paczki lub nawet szybciej.Odniesienie: https://www.geeksforgeeks.org/customized-serialization-and-deserialization-in-java/
Przykład:
Klasa niestandardowa do serializacji
źródło
Paczka jest znacznie szybsza niż serializowana z Binder, ponieważ serializowalne użycie odbicia i powoduje wiele GC. Parcelable to konstrukcja zoptymalizowana pod kątem przekazywania obiektu.
Oto link do referencji. http://www.developerphil.com/parcelable-vs-serializable/
źródło
możesz użyć obiektów możliwych do serializacji w zamierzeniu, ale w momencie serializacji obiektu Parcelable może dać poważny wyjątek, taki jak NotSerializableException. Czy nie jest zalecane używanie serializowalnego z paczkowanym. Dlatego lepiej jest rozszerzyć działkę paczkową o obiekt, którego chcesz użyć z pakietem i zamiarami. Ponieważ ten działka jest specyficzny dla Androida, więc nie ma żadnych skutków ubocznych. :)
źródło
Serializowalny
Serializable to interfejs oznaczalny lub możemy go wywołać jako pusty interfejs. Nie ma żadnych wcześniej zaimplementowanych metod. Serializable zamierza przekonwertować obiekt na strumień bajtów. Użytkownik może więc przekazywać dane między jednym działaniem a drugim. Główną zaletą serializacji jest tworzenie i przekazywanie danych jest bardzo łatwe, ale jest to proces powolny w porównaniu do paczkowania.
Paczka
Usługa paczkowania jest szybsza niż możliwość serializacji. Działka paczkowa zamierza przekonwertować obiekt na strumień bajtów i przekazać dane między dwoma działaniami. Pisanie paczkowego kodu jest trochę skomplikowane w porównaniu do serializacji. Nie tworzy więcej obiektów tymczasowych podczas przekazywania danych między dwoma działaniami.
źródło