コード例 #1
0
ファイル: Test.java プロジェクト: metachris/binary-serializer
  public static void main(String[] args) {
    // Create 128 byte String
    String l = "";
    for (int i = 0; i < 128; i++) l += "a";

    // Build the package
    BinarySerializer bin = new BinarySerializer();
    bin.addString(127, l);
    bin.addString(128, "hello world");

    // Encode to final byte array
    byte[] result = bin.encode();
    log("result: " + result.length + " bytes");
    log("===");

    // Decode payloads of request into indexed byte arrays
    bin.decode(result);

    log("===");
    log(new String(bin.getBytes(127)));
  }
コード例 #2
0
  @CheckForNull
  private GenericValue deserializeValue(
      ByteReader source, @CheckForNull Type declaredType, @CheckForNull MetaData declaredMetaData) {
    boolean optional = (declaredType == null || declaredType.isOptional());
    MetaData actualMetaData = null;
    if (declaredMetaData == null || declaredMetaData.getMetaType().isPolymorphic()) {
      if ((declaredMetaData != null) && (declaredMetaData.getMetaType() == MetaType.ENTITY)) {
        actualMetaData = BootStrap.ENTITY_ID;
      } else {
        // Polymorphic type: Read actual type or 'null'-type.
        EntityId actualTypeId = serializerRepository.getEntityIdSerializer().deserialize(source);
        if (!BootStrap.ID_NULL_REFERENCE.equals(actualTypeId)) {
          actualMetaData = serializerRepository.getMetaData(actualTypeId);
        }
      }
    } else {
      // Non-polymorphic type: Do not read actual type.
      if (!optional || source.getVarInt() != 0) {
        actualMetaData = declaredMetaData;
      }
    }

    if (actualMetaData == null) {
      if (!optional) {
        throw new SerializerException("Non-optional entry found to be null!");
      }
      return null;
    }

    switch (actualMetaData.getMetaType()) {
      case ENTITY:
        {
          EntityId entityId = serializerRepository.getEntityIdSerializer().deserialize(source);
          return BootStrap.ID_NULL_REFERENCE.equals(entityId) ? null : new EntityIdValue(entityId);
        }
      case PRIMITIVE:
        {
          Primitive primitive = Primitive.byEntityId(actualMetaData.getEntityId());
          BinarySerializer<?> serializer =
              serializerRepository.getPrimitiveSerializer(actualMetaData.getEntityId());
          return new PrimitiveValue(primitive, serializer.deserialize(source));
        }
      case VALUE_OBJECT:
        {
          BinarySerializer<ObjectInfo> serializer =
              serializerRepository.getBinarySerializer(actualMetaData.getEntityId());
          return new ValueObjectValue(serializer.deserialize(source));
        }
      case COLLECTION:
        {
          // Read element MetaDataId.
          EntityId elementMetaDataId =
              serializerRepository.getEntityIdSerializer().deserialize(source);
          // Read element count.
          int count = MathUtil.longToInt(source.getVarInt());
          // Read custom collection implementation data.
          BinarySerializer<ObjectInfo> serializer =
              serializerRepository.getBinarySerializer(actualMetaData.getEntityId());
          ObjectInfo collectionInfo = serializer.deserialize(source);
          // Read all elements.
          ImmutableArrayList.Builder<GenericValue> builder = ImmutableArrayList.newBuilder(count);
          for (int i = 0; i < count; ++i) {
            Type elementType = (declaredType == null) ? null : declaredType.getElementType();
            MetaData metaData =
                (elementType == null)
                    ? null
                    : serializerRepository.getMetaData(elementType.getMetaDataId());
            GenericValue value = deserializeValue(source, elementType, metaData);
            builder.add((value == null) ? GenericValue.nullValue() : value);
          }
          return new CollectionValue(collectionInfo, elementMetaDataId, builder.build());
        }
      default:
        throw new IllegalStateException("Unknown MetaType " + actualMetaData.getMetaType());
    }
  }
コード例 #3
0
 /**
  * 직렬화 정보를 담은 바이트 배열을 역직렬화하여 객체를 빌드합니다.
  *
  * @param clazz Type of deserialized object
  * @param <T> Type of deseiralized object
  * @return deserialized object
  */
 public static <T> T deserializeObject(byte[] bytes, Class<T> clazz) {
   return serializer.deserialize(bytes, clazz);
 }
コード例 #4
0
 /**
  * 객체를 바이너리 직렬화를 수행합니다.
  *
  * @param graph 직렬화할 객체
  * @return 직렬화 결과를 담은 바이트 배열
  */
 public static byte[] serializeObject(Object graph) {
   return serializer.serialize(graph);
 }