/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.coordinator.client.service.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Array; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.coordinator.exceptions.CoordinatorException; /** * Generic serialization for an Object * * @author watson * */ public class GenericSerializer { private static final Logger _log = LoggerFactory.getLogger(GenericSerializer.class); private static final int MAX_ZK_OBJECT_SIZE_IN_BYTES = 250000; private static final int LOG_SIZE_IN_BYTES = 4 * MAX_ZK_OBJECT_SIZE_IN_BYTES; /** * Will serialize any serializable object. * @param object -- Java object that is serializable. * @param logName -- Name of object for log messages (can be null) * @param zkData -- if true, will impose a maximum size limit of MAX_ZK_OBJECT_SIZE_IN_BYTES, which is maximum size for zookeeper data * @return byte[] representing serialized data * @throws CoordinatorException for exceedingLimit if checked */ static public byte[] serialize(Object object, String logName, boolean zkData) { String className = (object != null) ? object.getClass().getSimpleName() : ""; String label = (logName != null) ? logName : ""; try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); ObjectOutputStream ostream = new ObjectOutputStream(stream); ostream.writeObject(object); byte[] byteArray = stream.toByteArray(); if (zkData && byteArray.length > MAX_ZK_OBJECT_SIZE_IN_BYTES) { _log.error(String.format("Serialization failure: Class %s %s Byte Array length is %d limit is %d", className, label, byteArray.length, MAX_ZK_OBJECT_SIZE_IN_BYTES)); throw CoordinatorException.fatals.exceedingLimit("byte array size", MAX_ZK_OBJECT_SIZE_IN_BYTES); } else if (byteArray.length > LOG_SIZE_IN_BYTES) { _log.info(String.format("Serialization large object class %s %s size %d", className, label, byteArray.length)); } return byteArray; } catch (Exception ex) { throw CoordinatorException.fatals.failedToSerialize(ex); } } /** * De-serializes an object from byte[] data * @param data-- object data as byte[] * @return Object */ static public Object deserialize(byte[] data) { try { ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data)); Object object = stream.readObject(); return object; } catch (Exception ex) { throw CoordinatorException.fatals.failedToDeserialize(ex); } } }