/*
* Copyright (c) 2008-2012, Hazel Bilisim Ltd. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.nio;
import com.hazelcast.logging.ILogger;
import com.hazelcast.logging.Logger;
import java.io.*;
import java.util.Date;
import java.util.logging.Level;
public class SerializationHelper {
final static ILogger logger = Logger.getLogger(SerializationHelper.class.getName());
public static void writeObject(DataOutput out, Object obj) throws IOException {
if (obj == null) {
out.writeByte(0);
} else if (obj instanceof Long) {
out.writeByte(1);
out.writeLong((Long) obj);
} else if (obj instanceof Integer) {
out.writeByte(2);
out.writeInt((Integer) obj);
} else if (obj instanceof String) {
out.writeByte(3);
out.writeUTF((String) obj);
} else if (obj instanceof Double) {
out.writeByte(4);
out.writeDouble((Double) obj);
} else if (obj instanceof Float) {
out.writeByte(5);
out.writeFloat((Float) obj);
} else if (obj instanceof Boolean) {
out.writeByte(6);
out.writeBoolean((Boolean) obj);
} else if (obj instanceof DataSerializable) {
out.writeByte(7);
out.writeUTF(obj.getClass().getName());
((DataSerializable) obj).writeData(out);
} else if (obj instanceof Date) {
out.writeByte(8);
out.writeLong(((Date) obj).getTime());
} else {
out.writeByte(9);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.close();
byte[] buf = bos.toByteArray();
out.writeInt(buf.length);
out.write(buf);
}
}
public static Object readObject(DataInput in) throws IOException {
byte type = in.readByte();
if (type == 0) {
return null;
} else if (type == 1) {
return in.readLong();
} else if (type == 2) {
return in.readInt();
} else if (type == 3) {
return in.readUTF();
} else if (type == 4) {
return in.readDouble();
} else if (type == 5) {
return in.readFloat();
} else if (type == 6) {
return in.readBoolean();
} else if (type == 7) {
DataSerializable ds;
try {
String className = in.readUTF();
ds = (DataSerializable) Serializer.newInstance(Serializer.loadClass(className));
} catch (Throwable e) {
throw new IOException(e.getMessage());
}
ds.readData(in);
return ds;
} else if (type == 8) {
return new Date(in.readLong());
} else if (type == 9) {
int len = in.readInt();
byte[] buf = new byte[len];
in.readFully(buf);
ObjectInputStream oin = AbstractSerializer.newObjectInputStream(new ByteArrayInputStream(buf));
try {
return oin.readObject();
} catch (ClassNotFoundException e) {
logger.log(Level.WARNING, e.getMessage(), e);
}
oin.close();
} else {
throw new IOException("Unknown object type=" + type);
}
return null;
}
public static void writeByteArray(DataOutput out, byte[] value) throws IOException {
int size = (value == null) ? 0 : value.length;
out.writeInt(size);
if (size > 0) {
out.write(value);
}
}
public static byte[] readByteArray(DataInput in) throws IOException {
int size = in.readInt();
if (size == 0) {
return null;
} else {
byte[] b = new byte[size];
in.readFully(b);
return b;
}
}
}