blob: a19636b2ab6a7e8bd6251e8761407aefc41537fd [file] [log] [blame]
Jonathan Hart23701d12014-04-03 10:45:48 -07001package net.onrc.onos.core.util.serializers;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07002
TeruUd1c5b652014-03-24 13:58:46 -07003import java.net.Inet4Address;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -08004import java.net.InetAddress;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07005import java.util.ArrayList;
TeruU7feef8a2014-04-03 00:15:49 -07006import java.util.Date;
TeruUf9111652014-05-14 23:10:35 -07007import java.util.HashMap;
TeruUd1c5b652014-03-24 13:58:46 -07008import java.util.HashSet;
Yuta HIGUCHIc25861a2014-06-17 23:17:09 -07009import java.util.LinkedList;
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -070010import java.util.List;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070011import java.util.concurrent.ConcurrentHashMap;
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -070012import java.util.concurrent.ConcurrentLinkedQueue;
13
14import javax.annotation.concurrent.ThreadSafe;
TeruU7feef8a2014-04-03 00:15:49 -070015
Pavlin Radoslavov695f8952014-07-23 16:57:01 -070016import net.floodlightcontroller.core.IFloodlightProviderService.Role;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070017import net.floodlightcontroller.util.MACAddress;
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -070018import net.onrc.onos.api.batchoperation.BatchOperationEntry;
Toshio Koided6cbec32014-08-27 15:23:44 -070019import net.onrc.onos.api.flowmanager.FlowBatchOperation;
20import net.onrc.onos.api.flowmanager.FlowBatchState;
Toshio Koide2c67a2d2014-08-27 11:30:56 -070021import net.onrc.onos.api.flowmanager.FlowId;
22import net.onrc.onos.api.flowmanager.FlowLink;
Toshio Koideb7a578c2014-08-22 18:00:54 -070023import net.onrc.onos.api.flowmanager.FlowState;
Toshio Koide2c67a2d2014-08-27 11:30:56 -070024import net.onrc.onos.api.flowmanager.OpticalPathFlow;
25import net.onrc.onos.api.flowmanager.PacketPathFlow;
26import net.onrc.onos.api.flowmanager.SingleDstTreeFlow;
27import net.onrc.onos.api.flowmanager.Tree;
Sho SHIMIZU1674fb32014-08-20 14:44:31 -070028import net.onrc.onos.api.newintent.AbstractIntent;
29import net.onrc.onos.api.newintent.ConnectivityIntent;
30import net.onrc.onos.api.newintent.IntentEvent;
31import net.onrc.onos.api.newintent.IntentId;
Sho SHIMIZU07ace752014-08-21 09:04:41 -070032import net.onrc.onos.api.newintent.IntentState;
Sho SHIMIZU1674fb32014-08-20 14:44:31 -070033import net.onrc.onos.api.newintent.MultiPointToSinglePointIntent;
34import net.onrc.onos.api.newintent.OpticalConnectivityIntent;
35import net.onrc.onos.api.newintent.PacketConnectivityIntent;
36import net.onrc.onos.api.newintent.PointToPointIntent;
37import net.onrc.onos.api.newintent.SinglePointToMultiPointIntent;
TeruU3c049c42014-04-15 10:13:25 -070038import net.onrc.onos.apps.proxyarp.ArpCacheNotification;
Jonathan Hart0961fe82014-04-03 09:56:25 -070039import net.onrc.onos.apps.proxyarp.ArpReplyNotification;
Jonathan Hart03102132014-07-01 23:22:04 -070040import net.onrc.onos.core.hostmanager.Host;
Jonathan Hartaa380972014-04-03 10:24:46 -070041import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
42import net.onrc.onos.core.intent.ErrorIntent;
43import net.onrc.onos.core.intent.Intent;
44import net.onrc.onos.core.intent.IntentOperation;
45import net.onrc.onos.core.intent.IntentOperationList;
Yuta HIGUCHI1fc395e2014-05-13 14:06:28 -070046import net.onrc.onos.core.intent.Path;
Jonathan Hartaa380972014-04-03 10:24:46 -070047import net.onrc.onos.core.intent.PathIntent;
48import net.onrc.onos.core.intent.ShortestPathIntent;
49import net.onrc.onos.core.intent.runtime.IntentStateList;
Brian O'Connor0efc9062014-09-02 14:47:28 -070050import net.onrc.onos.core.matchaction.MatchAction;
51import net.onrc.onos.core.matchaction.MatchActionId;
52import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
53import net.onrc.onos.core.matchaction.MatchActionOperations;
54import net.onrc.onos.core.matchaction.MatchActionOperationsId;
55import net.onrc.onos.core.matchaction.MatchActionOperationsState;
56import net.onrc.onos.core.matchaction.SwitchResult;
57import net.onrc.onos.core.matchaction.SwitchResultList;
Toshio Koide2c67a2d2014-08-27 11:30:56 -070058import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
59import net.onrc.onos.core.matchaction.action.ModifySrcMacAction;
Brian O'Connorab3e9e62014-09-09 23:45:55 -070060import net.onrc.onos.core.matchaction.action.NullAction;
Toshio Koide2c67a2d2014-08-27 11:30:56 -070061import net.onrc.onos.core.matchaction.action.OutputAction;
62import net.onrc.onos.core.matchaction.match.PacketMatch;
Sho SHIMIZU07ace752014-08-21 09:04:41 -070063import net.onrc.onos.core.newintent.IntentCompilationResult;
Sho SHIMIZU1674fb32014-08-20 14:44:31 -070064import net.onrc.onos.core.newintent.PathFlowIntent;
65import net.onrc.onos.core.newintent.SingleDstTreeFlowIntent;
66import net.onrc.onos.core.newintent.SingleSrcTreeFlowIntent;
Sho SHIMIZU95d53c82014-08-21 09:18:47 -070067import net.onrc.onos.core.newintent.TestIntent;
68import net.onrc.onos.core.newintent.TestSubclassIntent;
Jonathan Hart313fdf02014-04-10 14:09:46 -070069import net.onrc.onos.core.packetservice.BroadcastPacketOutNotification;
Jonathan Harte6e63732014-04-16 14:29:49 -070070import net.onrc.onos.core.packetservice.PacketOutNotification;
Jonathan Hart313fdf02014-04-10 14:09:46 -070071import net.onrc.onos.core.packetservice.SinglePacketOutNotification;
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -070072import net.onrc.onos.core.topology.AdminStatus;
73import net.onrc.onos.core.topology.ConfigState;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070074import net.onrc.onos.core.topology.HostData;
75import net.onrc.onos.core.topology.LinkData;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -070076import net.onrc.onos.core.topology.MastershipData;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070077import net.onrc.onos.core.topology.PortData;
78import net.onrc.onos.core.topology.SwitchData;
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -070079import net.onrc.onos.core.topology.TopologyBatchOperation;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070080import net.onrc.onos.core.topology.TopologyElement;
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -070081import net.onrc.onos.core.topology.TopologyEvent;
Jonathan Hart23701d12014-04-03 10:45:48 -070082import net.onrc.onos.core.util.Dpid;
Jonathan Hart23701d12014-04-03 10:45:48 -070083import net.onrc.onos.core.util.IPv4;
84import net.onrc.onos.core.util.IPv4Net;
85import net.onrc.onos.core.util.IPv6;
86import net.onrc.onos.core.util.IPv6Net;
Yuta HIGUCHI02ccb8c2014-07-10 11:29:45 -070087import net.onrc.onos.core.util.LinkTuple;
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -070088import net.onrc.onos.core.util.OnosInstanceId;
Yuta HIGUCHIfb564502014-06-16 21:29:00 -070089import net.onrc.onos.core.util.PortNumber;
Yuta HIGUCHI5c8cbeb2014-06-27 11:13:48 -070090import net.onrc.onos.core.util.SwitchPort;
Jonathan Hart23701d12014-04-03 10:45:48 -070091
Yuta HIGUCHI2d5ac522014-01-22 10:21:41 -080092import com.esotericsoftware.kryo.Kryo;
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -070093import com.esotericsoftware.kryo.io.Input;
94import com.esotericsoftware.kryo.io.Output;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -070095
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070096/**
97 * Class factory for allocating Kryo instances for
98 * serialization/deserialization of classes.
99 */
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700100@ThreadSafe
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700101public class KryoFactory {
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700102
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700103 private static final int DEFAULT_PREALLOCATIONS = 100;
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700104 /**
105 * Default buffer size used for serialization.
106 *
107 * @see #serialize(Object)
108 */
109 public static final int DEFAULT_BUFFER_SIZE = 1 * 1000 * 1000;
110
111 private static final KryoFactory GLOBAL_POOL = new KryoFactory();
112
113 private ConcurrentLinkedQueue<Kryo> kryoList = new ConcurrentLinkedQueue<Kryo>();
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700114
115 /**
116 * Default constructor.
Ray Milkey269ffb92014-04-03 14:43:30 -0700117 * <p/>
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700118 * Preallocates {@code DEFAULT_PREALLOCATIONS} Kryo instances.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700119 */
120 public KryoFactory() {
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700121 this(DEFAULT_PREALLOCATIONS);
122 }
123
124 /**
Ray Milkeyb41100a2014-04-10 10:42:15 -0700125 * Constructor to explicitly specify number of Kryo instances to pool.
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700126 *
127 * @param initialCapacity number of Kryo instance to preallocate
128 */
129 public KryoFactory(final int initialCapacity) {
130 // Preallocate
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700131 for (int i = 0; i < initialCapacity; i++) {
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700132 Kryo kryo = newKryoObject();
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700133 kryoList.add(kryo);
134 }
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700135 }
136
137 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700138 * Gets a new Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700139 *
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700140 * @return the Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700141 */
142 public Kryo newKryo() {
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700143 Kryo kryo = kryoList.poll();
144 if (kryo == null) {
145 // Will defer additional allocation until deleteKryo().
146 // It is more likely that it is no longer latency sensitive
147 // by the time caller is recycling Kryo instance.
148 return newKryoObject();
149 } else {
150 return kryo;
151 }
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700152 }
153
154 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700155 * Deletes an existing Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700156 *
157 * @param deleteKryo the object to delete.
158 */
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700159 public void deleteKryo(final Kryo deleteKryo) {
160 if (kryoList.isEmpty()) {
161 // buffer extra if kryo instance pool has exhausted.
162 List<Kryo> kryos = new ArrayList<>(DEFAULT_PREALLOCATIONS);
163 for (int i = 0; i < DEFAULT_PREALLOCATIONS; ++i) {
164 kryos.add(newKryoObject());
Ray Milkey269ffb92014-04-03 14:43:30 -0700165 }
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700166 kryoList.addAll(kryos);
Ray Milkey269ffb92014-04-03 14:43:30 -0700167 }
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700168
169 // recycle
170 kryoList.add(deleteKryo);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700171 }
172
173 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700174 * Creates and initializes a new Kryo object.
175 *<p>
176 * NOTE: This operation can be slow and should be used only if the
177 * application needs a single Kryo instance (e.g., during startup).
178 * For faster allocation, the application should use #newKryo()
179 * and #deleteKryo() factory methods.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700180 *
181 * @return the created Kryo object.
182 */
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700183 public static Kryo newKryoObject() {
Ray Milkey269ffb92014-04-03 14:43:30 -0700184 Kryo kryo = new Kryo();
185 kryo.setRegistrationRequired(true);
186 //
187 // WARNING: Order of register() calls affects serialized bytes.
188 // - Do no insert new entry in the middle, always add to the end.
189 // - Do not simply remove existing entry
190 //
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700191
Ray Milkey269ffb92014-04-03 14:43:30 -0700192 // kryo.setReferences(false);
193 //
194 kryo.register(ArrayList.class);
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700195
Ray Milkey269ffb92014-04-03 14:43:30 -0700196 // FlowPath and related classes
Ray Milkey269ffb92014-04-03 14:43:30 -0700197 kryo.register(Dpid.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700198 kryo.register(IPv4.class);
199 kryo.register(IPv4Net.class);
200 kryo.register(IPv6.class);
201 kryo.register(IPv6Net.class);
202 kryo.register(byte[].class);
203 kryo.register(MACAddress.class);
Yuta HIGUCHIfb564502014-06-16 21:29:00 -0700204 kryo.register(PortNumber.class);
Yuta HIGUCHI5c8cbeb2014-06-27 11:13:48 -0700205 kryo.register(SwitchPort.class);
Yuta HIGUCHI02ccb8c2014-07-10 11:29:45 -0700206 kryo.register(LinkTuple.class);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700207
Ray Milkey269ffb92014-04-03 14:43:30 -0700208 // New data model-related classes
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -0700209 kryo.register(AdminStatus.class);
210 kryo.register(ConcurrentHashMap.class);
211 kryo.register(ConfigState.class);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700212 kryo.register(HostData.class);
Yuta HIGUCHIc25861a2014-06-17 23:17:09 -0700213 kryo.register(LinkedList.class);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700214 kryo.register(LinkData.class);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700215 kryo.register(MastershipData.class);
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -0700216 kryo.register(OnosInstanceId.class);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700217 kryo.register(PortData.class);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700218 kryo.register(Role.class);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700219 kryo.register(SwitchData.class);
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -0700220 kryo.register(TopologyBatchOperation.class);
221 kryo.register(TopologyBatchOperation.Operator.class);
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700222 kryo.register(TopologyElement.class);
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -0700223 kryo.register(TopologyEvent.class);
Pavlin Radoslavov31f85102014-08-15 13:55:44 -0700224 kryo.register(TopologyEvent.Type.class);
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -0800225
Ray Milkey269ffb92014-04-03 14:43:30 -0700226 // Intent-related classes
227 kryo.register(Path.class);
228 kryo.register(Intent.class);
229 kryo.register(Intent.IntentState.class);
230 kryo.register(PathIntent.class);
231 kryo.register(ShortestPathIntent.class);
232 kryo.register(ConstrainedShortestPathIntent.class);
233 kryo.register(ErrorIntent.class);
234 kryo.register(ErrorIntent.ErrorType.class);
235 kryo.register(IntentOperation.class);
236 kryo.register(IntentOperation.Operator.class);
237 kryo.register(IntentOperationList.class);
238 kryo.register(IntentStateList.class);
TeruUf9111652014-05-14 23:10:35 -0700239 kryo.register(HashMap.class);
Toshio Koideeb90d912014-02-18 21:30:22 -0800240
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -0700241 // New intent-related classes
242 kryo.register(BatchOperationEntry.class);
Sho SHIMIZU1674fb32014-08-20 14:44:31 -0700243 kryo.register(IntentId.class);
244 kryo.register(IntentEvent.class);
Sho SHIMIZU07ace752014-08-21 09:04:41 -0700245 kryo.register(IntentState.class);
246 kryo.register(IntentCompilationResult.class);
Sho SHIMIZU1674fb32014-08-20 14:44:31 -0700247 kryo.register(AbstractIntent.class);
248 kryo.register(ConnectivityIntent.class);
249 kryo.register(PointToPointIntent.class);
250 kryo.register(MultiPointToSinglePointIntent.class);
251 kryo.register(SinglePointToMultiPointIntent.class);
252 kryo.register(net.onrc.onos.api.newintent.PathIntent.class);
253 kryo.register(PathFlowIntent.class);
254 kryo.register(SingleSrcTreeFlowIntent.class);
255 kryo.register(SingleDstTreeFlowIntent.class);
256 kryo.register(PacketConnectivityIntent.class);
257 kryo.register(OpticalConnectivityIntent.class);
Sho SHIMIZU95d53c82014-08-21 09:18:47 -0700258 // FIXME: due to lack of functionality to register a serializer
259 // in API user side, we added the following two classes.
260 // Theoretically the classes are only for test. we should create
261 // a way to register serializer without editing source code
262 kryo.register(TestIntent.class);
263 kryo.register(TestSubclassIntent.class);
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -0700264
Toshio Koide2c67a2d2014-08-27 11:30:56 -0700265 // New flow manager related classes
266 kryo.register(FlowId.class);
Toshio Koideb7a578c2014-08-22 18:00:54 -0700267 kryo.register(FlowState.class);
Toshio Koided6cbec32014-08-27 15:23:44 -0700268 kryo.register(FlowBatchOperation.class);
269 kryo.register(FlowBatchOperation.Operator.class);
270 kryo.register(FlowBatchState.class);
Toshio Koide2c67a2d2014-08-27 11:30:56 -0700271 kryo.register(net.onrc.onos.api.flowmanager.Path.class);
272 kryo.register(Tree.class);
273 kryo.register(FlowLink.class);
274 kryo.register(OpticalPathFlow.class);
275 kryo.register(PacketPathFlow.class);
276 kryo.register(SingleDstTreeFlow.class);
277
278 // New match action related classes
Brian O'Connor0efc9062014-09-02 14:47:28 -0700279 kryo.register(MatchAction.class);
280 kryo.register(MatchActionId.class);
Toshio Koide2c67a2d2014-08-27 11:30:56 -0700281 kryo.register(PacketMatch.class);
282 kryo.register(OutputAction.class);
283 kryo.register(ModifyDstMacAction.class);
284 kryo.register(ModifySrcMacAction.class);
Brian O'Connor0efc9062014-09-02 14:47:28 -0700285 kryo.register(MatchActionOperations.class);
286 kryo.register(MatchActionOperations.Operator.class);
287 kryo.register(MatchActionOperationsId.class);
288 kryo.register(MatchActionOperationsState.class);
289 kryo.register(MatchActionOperationEntry.class);
290 kryo.register(SwitchResultList.class);
291 kryo.register(SwitchResult.class);
292 kryo.register(SwitchResult.Status.class);
Brian O'Connorab3e9e62014-09-09 23:45:55 -0700293 kryo.register(NullAction.class);
Toshio Koide2c67a2d2014-08-27 11:30:56 -0700294
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700295 // Host-related classes
Ray Milkey269ffb92014-04-03 14:43:30 -0700296 kryo.register(HashSet.class);
Jonathan Hart03102132014-07-01 23:22:04 -0700297 kryo.register(Host.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700298 kryo.register(Date.class);
TeruU7feef8a2014-04-03 00:15:49 -0700299
Ray Milkey269ffb92014-04-03 14:43:30 -0700300 // ProxyArp-related classes
Jonathan Harte6e63732014-04-16 14:29:49 -0700301 kryo.register(PacketOutNotification.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700302 kryo.register(BroadcastPacketOutNotification.class);
303 kryo.register(SinglePacketOutNotification.class);
304 kryo.register(ArpReplyNotification.class);
TeruU3c049c42014-04-15 10:13:25 -0700305 kryo.register(ArpCacheNotification.class);
Yuta HIGUCHIc25861a2014-06-17 23:17:09 -0700306 // TODO check if InetAddress related is still used
307 // TODO check if InetAddress can be correctly serialized
308 kryo.register(InetAddress.class);
309 kryo.register(Inet4Address.class);
TeruUd1c5b652014-03-24 13:58:46 -0700310
Ray Milkey269ffb92014-04-03 14:43:30 -0700311 return kryo;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700312 }
Yuta HIGUCHIe57e10e2014-08-20 14:25:30 -0700313
314 /**
315 * Serializes given object to byte array using Kryo instance in global pool.
316 * <p>
317 * Note: Serialized bytes must be smaller than DEFAULT_BUFFER_SIZE (=1MB).
318 *
319 * @param obj Object to serialize (Class must be registered to KryoFactory)
320 * @return serialized bytes
321 */
322 public static byte[] serialize(final Object obj) {
323 return serialize(obj, DEFAULT_BUFFER_SIZE);
324 }
325
326 /**
327 * Serializes given object to byte array using Kryo instance in global pool.
328 *
329 * @param obj Object to serialize (Class must be registered to KryoFactory)
330 * @param bufferSize maximum size of serialized bytes
331 * @return serialized bytes
332 */
333 public static byte[] serialize(final Object obj, final int bufferSize) {
334 Output out = new Output(bufferSize);
335 Kryo kryo = GLOBAL_POOL.newKryo();
336 try {
337 kryo.writeClassAndObject(out, obj);
338 return out.toBytes();
339 } finally {
340 GLOBAL_POOL.deleteKryo(kryo);
341 }
342 }
343
344 /**
345 * Deserializes given byte array to Object using Kryo instance in global pool.
346 *
347 * @param bytes serialized bytes
348 * @param <T> deserialized Object type
349 * @return deserialized Object (Class must be registered to KryoFactory)
350 */
351 public static <T> T deserialize(final byte[] bytes) {
352 Input in = new Input(bytes);
353 Kryo kryo = GLOBAL_POOL.newKryo();
354 try {
355 @SuppressWarnings("unchecked")
356 T obj = (T) kryo.readClassAndObject(in);
357 return obj;
358 } finally {
359 GLOBAL_POOL.deleteKryo(kryo);
360 }
361 }
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700362}