All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.activej.serializer.util.RecordBinarySerializer Maven / Gradle / Ivy

Go to download

Extremely fast and space-efficient serializers. Implemented using bytecode engineering.

There is a newer version: 6.0-rc2
Show newest version
package io.activej.serializer.util;

import io.activej.common.builder.AbstractBuilder;
import io.activej.record.Record;
import io.activej.record.RecordScheme;
import io.activej.serializer.BinaryInput;
import io.activej.serializer.BinaryOutput;
import io.activej.serializer.BinarySerializer;
import io.activej.serializer.CorruptedDataException;

public final class RecordBinarySerializer implements BinarySerializer {
	private final RecordScheme scheme;
	private final BinarySerializer[] fieldSerializers;

	private RecordBinarySerializer(RecordScheme scheme) {
		this.scheme = scheme;
		this.fieldSerializers = new BinarySerializer[scheme.size()];
	}

	public static RecordBinarySerializer create(RecordScheme scheme) {
		return builder(scheme).build();
	}

	public static Builder builder(RecordScheme scheme) {
		return new RecordBinarySerializer(scheme).new Builder();
	}

	public final class Builder extends AbstractBuilder {
		private Builder() {}

		public Builder withField(String field, BinarySerializer fieldSerializer) {
			checkNotBuilt(this);
			RecordBinarySerializer.this.fieldSerializers[scheme.getFieldIndex(field)] = fieldSerializer;
			return this;
		}

		@Override
		protected RecordBinarySerializer doBuild() {
			return RecordBinarySerializer.this;
		}
	}

	@Override
	public void encode(BinaryOutput out, Record record) {
		for (int i = 0; i < fieldSerializers.length; i++) {
			//noinspection unchecked
			BinarySerializer serializer = (BinarySerializer) fieldSerializers[i];
			serializer.encode(out, record.get(i));
		}
	}

	@Override
	public Record decode(BinaryInput in) throws CorruptedDataException {
		Record record = scheme.record();
		for (int i = 0; i < fieldSerializers.length; i++) {
			BinarySerializer serializer = fieldSerializers[i];
			record.set(i, serializer.decode(in));
		}
		return record;
	}
}