use of org.apache.ignite.internal.binary.BinaryEnumArray in project ignite by apache.
the class BinaryBuilderSerializer method writeValue.
/**
* @param writer Writer.
* @param val Value.
* @param forceCol Whether to force collection type.
* @param forceMap Whether to force map type.
*/
public void writeValue(BinaryWriterExImpl writer, Object val, boolean forceCol, boolean forceMap) {
assert !(forceCol && forceMap);
if (val == null) {
writer.writeByte(GridBinaryMarshaller.NULL);
return;
}
if (val instanceof BinaryBuilderSerializationAware) {
((BinaryBuilderSerializationAware) val).writeTo(writer, this);
return;
}
if (val instanceof BinaryObjectExImpl) {
if (binaryObjToWrapper == null)
binaryObjToWrapper = new IdentityHashMap<>();
BinaryObjectBuilderImpl wrapper = binaryObjToWrapper.get(val);
if (wrapper == null) {
wrapper = BinaryObjectBuilderImpl.wrap((BinaryObject) val);
binaryObjToWrapper.put((BinaryObject) val, wrapper);
}
val = wrapper;
}
if (val instanceof BinaryObjectBuilderImpl) {
BinaryObjectBuilderImpl obj = (BinaryObjectBuilderImpl) val;
Integer posInResArr = objToPos.get(obj);
if (posInResArr == null) {
objToPos.put(obj, writer.out().position());
obj.serializeTo(writer.newWriter(obj.typeId()), this);
} else {
int handle = writer.out().position() - posInResArr;
writer.writeByte(GridBinaryMarshaller.HANDLE);
writer.writeInt(handle);
}
return;
}
if (val instanceof BinaryEnumObjectImpl) {
BinaryEnumObjectImpl obj = (BinaryEnumObjectImpl) val;
writer.writeByte(GridBinaryMarshaller.ENUM);
writer.writeInt(obj.typeId());
if (obj.typeId() == GridBinaryMarshaller.UNREGISTERED_TYPE_ID)
writer.doWriteString(obj.className());
writer.writeInt(obj.enumOrdinal());
return;
}
if (IgniteUtils.isEnum(val.getClass())) {
String clsName = ((Enum) val).getDeclaringClass().getName();
int typeId = writer.context().typeId(clsName);
// Need register class for marshaller to be able to deserialize enum value.
writer.context().registerClass(((Enum) val).getDeclaringClass(), true, false);
writer.writeByte(GridBinaryMarshaller.ENUM);
writer.writeInt(typeId);
writer.writeInt(((Enum) val).ordinal());
return;
}
if (forceCol || BinaryUtils.isSpecialCollection(val.getClass())) {
Collection<?> c = (Collection<?>) val;
writer.writeByte(GridBinaryMarshaller.COL);
writer.writeInt(c.size());
byte colType = writer.context().collectionType(c.getClass());
writer.writeByte(colType);
for (Object obj : c) writeValue(writer, obj);
return;
}
if (forceMap || BinaryUtils.isSpecialMap(val.getClass())) {
Map<?, ?> map = (Map<?, ?>) val;
writer.writeByte(GridBinaryMarshaller.MAP);
writer.writeInt(map.size());
writer.writeByte(writer.context().mapType(map.getClass()));
for (Map.Entry<?, ?> entry : map.entrySet()) {
writeValue(writer, entry.getKey());
writeValue(writer, entry.getValue());
}
return;
}
Byte flag = BinaryUtils.PLAIN_CLASS_TO_FLAG.get(val.getClass());
if (flag != null) {
BinaryUtils.writePlainObject(writer, val);
return;
}
if (val instanceof BinaryEnumArray) {
BinaryArray val0 = (BinaryArray) val;
if (val0.componentTypeId() == GridBinaryMarshaller.UNREGISTERED_TYPE_ID)
writeArray(writer, GridBinaryMarshaller.ENUM_ARR, val0.array(), val0.componentClassName());
else
writeArray(writer, GridBinaryMarshaller.ENUM_ARR, val0.array(), val0.componentTypeId());
return;
}
if (val instanceof BinaryArray) {
BinaryArray val0 = (BinaryArray) val;
if (val0.componentTypeId() == GridBinaryMarshaller.UNREGISTERED_TYPE_ID)
writeArray(writer, GridBinaryMarshaller.OBJ_ARR, val0.array(), val0.componentClassName());
else
writeArray(writer, GridBinaryMarshaller.OBJ_ARR, val0.array(), val0.componentTypeId());
return;
}
if (val instanceof Object[]) {
Class<?> compCls = ((Object[]) val).getClass().getComponentType();
int compTypeId = writer.context().typeId(compCls.getName());
if (BinaryEnumObjectImpl.class.isAssignableFrom(compCls) || val instanceof BinaryBuilderEnum[]) {
writeArray(writer, GridBinaryMarshaller.ENUM_ARR, (Object[]) val, compTypeId);
return;
}
if (compCls.isEnum()) {
Enum[] enumArr = (Enum[]) val;
writer.context().registerClass(compCls, true, false);
writer.writeByte(GridBinaryMarshaller.ENUM_ARR);
writer.writeInt(compTypeId);
writer.writeInt(enumArr.length);
for (Enum anEnum : enumArr) writeValue(writer, anEnum);
return;
}
writeArray(writer, GridBinaryMarshaller.OBJ_ARR, (Object[]) val, compTypeId);
return;
}
writer.doWriteObject(val);
}
use of org.apache.ignite.internal.binary.BinaryEnumArray in project ignite by apache.
the class BinaryObjectBuilderImpl method checkMetadata.
/**
* Checks metadata when a BinaryObject is being serialized.
*
* @param meta Current metadata.
* @param fieldsMeta Map holding metadata information that has to be updated.
* @param newVal Field value being serialized.
* @param name Field name.
* @param fieldId Field ID.
*/
private Map<String, BinaryFieldMetadata> checkMetadata(BinaryType meta, Map<String, BinaryFieldMetadata> fieldsMeta, Object newVal, String name, int fieldId) {
String oldFldTypeName = meta == null ? null : meta.fieldTypeName(name);
boolean nullFieldVal = false;
int newFldTypeId;
if (newVal instanceof BinaryValueWithType) {
newFldTypeId = ((BinaryValueWithType) newVal).typeId();
if (((BinaryValueWithType) newVal).value() == null)
nullFieldVal = true;
} else // Detect Enum and Enum array type.
if (newVal instanceof BinaryEnumObjectImpl)
newFldTypeId = GridBinaryMarshaller.ENUM;
else if (newVal.getClass().isArray() && BinaryEnumObjectImpl.class.isAssignableFrom(newVal.getClass().getComponentType()))
newFldTypeId = GridBinaryMarshaller.ENUM_ARR;
else if (newVal.getClass().isArray() && BinaryObject.class.isAssignableFrom(newVal.getClass().getComponentType()))
newFldTypeId = GridBinaryMarshaller.OBJ_ARR;
else if (newVal instanceof BinaryEnumArray)
newFldTypeId = GridBinaryMarshaller.ENUM_ARR;
else if (newVal instanceof BinaryArray)
newFldTypeId = GridBinaryMarshaller.OBJ_ARR;
else
newFldTypeId = BinaryUtils.typeByClass(newVal.getClass());
if (oldFldTypeName == null) {
// It's a new field, we have to add it to metadata.
if (fieldsMeta == null) {
if (BinaryUtils.FIELDS_SORTED_ORDER)
fieldsMeta = new TreeMap<>();
else
fieldsMeta = new LinkedHashMap<>();
}
fieldsMeta.put(name, new BinaryFieldMetadata(newFldTypeId, fieldId));
} else if (!nullFieldVal) {
String newFldTypeName = BinaryUtils.fieldTypeName(newFldTypeId);
if (!F.eq(newFldTypeName, oldFldTypeName) && !oldFldTypeName.equals(BinaryUtils.fieldTypeName(GridBinaryMarshaller.OBJ))) {
throw new BinaryObjectException("Wrong value has been set [" + "typeName=" + (typeName == null ? meta.typeName() : typeName) + ", fieldName=" + name + ", fieldType=" + oldFldTypeName + ", assignedValueType=" + newFldTypeName + ']');
}
}
return fieldsMeta;
}
use of org.apache.ignite.internal.binary.BinaryEnumArray 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