2 * Copyright 2014-2021 Open Networking Foundation
3 * Copyright 2023 PANTHEON.tech, s.r.o.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 package io.atomix.storage.journal;
19 import com.esotericsoftware.kryo.Serializer;
20 import io.atomix.utils.serializer.Namespace;
21 import java.io.InputStream;
22 import java.io.OutputStream;
23 import java.nio.ByteBuffer;
26 * Support for serialization of {@link Journal} entries.
28 public interface JournalSerdes {
30 * Serializes given object to byte array.
32 * @param obj Object to serialize
33 * @return serialized bytes
35 byte[] serialize(Object obj);
38 * Serializes given object to byte array.
40 * @param obj Object to serialize
41 * @param bufferSize maximum size of serialized bytes
42 * @return serialized bytes
44 byte[] serialize(Object obj, int bufferSize);
47 * Serializes given object to byte buffer.
49 * @param obj Object to serialize
50 * @param buffer to write to
52 void serialize(Object obj, ByteBuffer buffer);
55 * Serializes given object to OutputStream.
57 * @param obj Object to serialize
58 * @param stream to write to
60 void serialize(Object obj, OutputStream stream);
63 * Serializes given object to OutputStream.
65 * @param obj Object to serialize
66 * @param stream to write to
67 * @param bufferSize size of the buffer in front of the stream
69 void serialize(Object obj, OutputStream stream, int bufferSize);
72 * Deserializes given byte array to Object.
74 * @param bytes serialized bytes
75 * @param <T> deserialized Object type
76 * @return deserialized Object
78 <T> T deserialize(byte[] bytes);
81 * Deserializes given byte buffer to Object.
83 * @param buffer input with serialized bytes
84 * @param <T> deserialized Object type
85 * @return deserialized Object
87 <T> T deserialize(final ByteBuffer buffer);
90 * Deserializes given InputStream to an Object.
92 * @param stream input stream
93 * @param <T> deserialized Object type
94 * @return deserialized Object
96 <T> T deserialize(InputStream stream);
99 * Deserializes given InputStream to an Object.
101 * @param stream input stream
102 * @param <T> deserialized Object type
103 * @param bufferSize size of the buffer in front of the stream
104 * @return deserialized Object
106 <T> T deserialize(final InputStream stream, final int bufferSize);
109 * Creates a new {@link JournalSerdes} builder.
113 static Builder builder() {
114 return Namespace.builder();
118 * Builder for {@link JournalSerdes}.
122 * Builds a {@link JournalSerdes} instance.
124 * @return A {@link JournalSerdes} implementation.
126 JournalSerdes build();
129 * Builds a {@link JournalSerdes} instance.
131 * @param friendlyName friendly name for the namespace
132 * @return A {@link JournalSerdes} implementation.
134 JournalSerdes build(String friendlyName);
137 * Registers serializer for the given set of classes.
139 * When multiple classes are registered with an explicitly provided serializer, the namespace guarantees
140 * all instances will be serialized with the same type ID.
142 * @param classes list of classes to register
143 * @param serializer serializer to use for the class
144 * @return this builder
146 Builder register(Serializer<?> serializer, Class<?>... classes);
149 * Sets the namespace class loader.
151 * @param classLoader the namespace class loader
152 * @return this builder
154 Builder setClassLoader(ClassLoader classLoader);