use of org.apache.ignite.internal.binary.BinaryClassDescriptor in project ignite by apache.
the class CacheObjectBinaryProcessorImpl method marshalToBinary.
/**
* {@inheritDoc}
*/
@Override
public Object marshalToBinary(@Nullable Object obj, boolean failIfUnregistered) throws BinaryObjectException {
if (obj == null)
return null;
if (BinaryUtils.isBinaryType(obj.getClass()))
return obj;
if (obj instanceof Object[]) {
Object[] arr = (Object[]) obj;
Object[] pArr = new Object[arr.length];
for (int i = 0; i < arr.length; i++) pArr[i] = marshalToBinary(arr[i], failIfUnregistered);
if (!BinaryArray.useBinaryArrays())
return pArr;
Class<?> compCls = obj.getClass().getComponentType();
boolean isBinaryArr = BinaryObject.class.isAssignableFrom(compCls);
String compClsName = isBinaryArr ? Object.class.getName() : compCls.getName();
// In case of interface or multidimensional array rely on class name.
// Interfaces and array not registered as binary types.
BinaryClassDescriptor desc = binaryCtx.descriptorForClass(compCls);
if (compCls.isEnum() || compCls == BinaryEnumObjectImpl.class) {
return new BinaryEnumArray(binaryCtx, desc.registered() ? desc.typeId() : GridBinaryMarshaller.UNREGISTERED_TYPE_ID, compClsName, pArr);
} else {
return new BinaryArray(binaryCtx, desc.registered() ? desc.typeId() : GridBinaryMarshaller.UNREGISTERED_TYPE_ID, compClsName, pArr);
}
}
if (obj instanceof IgniteBiTuple) {
IgniteBiTuple tup = (IgniteBiTuple) obj;
if (obj instanceof T2)
return new T2<>(marshalToBinary(tup.get1(), failIfUnregistered), marshalToBinary(tup.get2(), failIfUnregistered));
return new IgniteBiTuple<>(marshalToBinary(tup.get1(), failIfUnregistered), marshalToBinary(tup.get2(), failIfUnregistered));
}
{
Collection<Object> pCol = BinaryUtils.newKnownCollection(obj);
if (pCol != null) {
Collection<?> col = (Collection<?>) obj;
for (Object item : col) pCol.add(marshalToBinary(item, failIfUnregistered));
return (pCol instanceof MutableSingletonList) ? U.convertToSingletonList(pCol) : pCol;
}
}
{
Map<Object, Object> pMap = BinaryUtils.newKnownMap(obj);
if (pMap != null) {
Map<?, ?> map = (Map<?, ?>) obj;
for (Map.Entry<?, ?> e : map.entrySet()) pMap.put(marshalToBinary(e.getKey(), failIfUnregistered), marshalToBinary(e.getValue(), failIfUnregistered));
return pMap;
}
}
if (obj instanceof Map.Entry) {
Map.Entry<?, ?> e = (Map.Entry<?, ?>) obj;
return new GridMapEntry<>(marshalToBinary(e.getKey(), failIfUnregistered), marshalToBinary(e.getValue(), failIfUnregistered));
}
if (binaryMarsh.mustDeserialize(obj))
// No need to go through marshal-unmarshal because result will be the same as initial object.
return obj;
byte[] arr = binaryMarsh.marshal(obj, failIfUnregistered);
assert arr.length > 0;
Object obj0 = binaryMarsh.unmarshal(arr, null);
// Possible if a class has writeObject method.
if (obj0 instanceof BinaryObjectImpl)
((BinaryObjectImpl) obj0).detachAllowed(true);
return obj0;
}
Aggregations