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

44 lines
1.4 KiB
Java

package com.parse;
import android.os.Parcel;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* This is a stateful implementation of {@link ParseParcelDecoder} that remembers which
* {@code ParseObject}s have been decoded. When a pointer is found and we have already decoded
* an instance for the same object id, we use the decoded instance.
*
* This is very similar to what {@link KnownParseObjectDecoder} does for JSON.
*/
/* package */ class ParseObjectParcelDecoder extends ParseParcelDecoder {
private Map<String, ParseObject> objects = new HashMap<>();
public ParseObjectParcelDecoder() {}
public void addKnownObject(ParseObject object) {
objects.put(getObjectOrLocalId(object), object);
}
@Override
protected ParseObject decodePointer(Parcel source) {
String className = source.readString();
String objectId = source.readString();
if (objects.containsKey(objectId)) {
return objects.get(objectId);
}
// Should not happen if encoding was done through ParseObjectParcelEncoder.
ParseObject object = ParseObject.createWithoutData(className, objectId);
objects.put(objectId, object);
return object;
}
private String getObjectOrLocalId(ParseObject object) {
return object.getObjectId() != null ? object.getObjectId() : object.getOrCreateLocalId();
}
}