First, lets say I have a value (of type long) long value; and I serialize it into a byte[] serialized[0] = (byte)((value & 0xFF00000000000000L) >> 56); serialized[1] = (byte)((value & 0x00FF000000000000L) >> 48); serialized[2] = (byte)((value & 0x0000FF0000000000L) >> 40); serialized[3] = (byte)((value & 0x000000FF00000000L) >> 32); serialized[4] = (byte)((value & 0x00000000FF000000L) >> 24); serialized[5] = (byte)((value & 0x0000000000FF0000L) >> 16); serialized[6] = (byte)((value & 0x000000000000FF00L) >> 8); serialized[7] = (byte)(value & 0x00000000000000FFL); And then unserialize it again: value2 = (long) (((serialized[0] & 0xFF) << 56) + ((serialized[1] & 0xFF) << 48) + ((serialized[2] & 0xFF) << 40) + ((serialized[3] & 0xFF) << 32) + ((serialized[4] & 0xFF) << 24) + ((serialized[5] & 0xFF) << 16) + ((serialized[6] & 0xFF) << 8) + (serialized[7] & 0xFF)); But now value differs greatly from value2.. what is my mistake?