ParseApplication/ExternalLibs/Parse-SDK-Android/Parse/src/main/java/com/parse/ParseObjectParcelEncoder.java

39 lines
1.1 KiB
Java

package com.parse;
import android.os.Parcel;
import java.util.HashSet;
import java.util.Set;
/**
* This is a stateful implementation of {@link ParseParcelEncoder} that remembers which
* {@code ParseObject}s have been encoded. If an object is found again in the object tree,
* it is encoded as a pointer rather than a full object, to avoid {@code StackOverflowError}s
* due to circular references.
*/
/* package */ class ParseObjectParcelEncoder extends ParseParcelEncoder {
private Set<String> ids = new HashSet<>();
public ParseObjectParcelEncoder() {}
public ParseObjectParcelEncoder(ParseObject root) {
ids.add(getObjectOrLocalId(root));
}
@Override
protected void encodeParseObject(ParseObject object, Parcel dest) {
String id = getObjectOrLocalId(object);
if (ids.contains(id)) {
encodePointer(object.getClassName(), id, dest);
} else {
ids.add(id);
super.encodeParseObject(object, dest);
}
}
private String getObjectOrLocalId(ParseObject object) {
return object.getObjectId() != null ? object.getObjectId() : object.getOrCreateLocalId();
}
}