Перевод List в byte[]

Cristalix

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Test
Здравствуйте.
Помогите пожалуйста перевести List (с данными) перевести в byte[] и обратно
 
PHP:
for (int i = 0; i < list.size(); i++) {
    byteArray[i] = list.get(i);
}

for (int i = 0; i < byteArray.length; i++) {
    list.set(i, byteArray[i]);
}
 
PHP:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;

try {
    out = new ObjectOutputStream(bos);
    out.writeObject(yourObject);
    out.flush();

    // TODO: делай чо хош, вот байты.
    byte[] yourBytes = bos.toByteArray();
} finally {
  try {
    bos.close();
  } catch (IOException ignored) {}
}
 
Последнее редактирование:
Забыл про то, что нужно еще и обратно, сорян :/

byte[] -> List
PHP:
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;

try {
    in = new ObjectInputStream(bis);

    // TODO: делай чо хош, вот объект.
    Object yourObject = in.readObject();
} finally {
    try {
        if (in != null) {
            in.close();
        }
    } catch (IOException ignored) {}
}
 
PHP:
for (int i = 0; i < list.size(); i++) {
    byteArray[i] = list.get(i);
}

for (int i = 0; i < byteArray.length; i++) {
    list.set(i, byteArray[i]);
}
Ты орешь? Ты понимаешь, что таким хреном ты только List<Byte> конвертируешь в массив? Мда.
 
PHP:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;

try {
    out = new ObjectOutputStream(bos);
    out.writeObject(yourObject);
    out.flush();

    // TODO: делай чо хош, вот байты.
    byte[] yourBytes = bos.toByteArray();
} finally {
  try {
    bos.close();
  } catch (IOException ignored) {}
}
соснешь тунца, если не наследуется Serializeable. + тебе уязвимость.
 
соснешь тунца, если не наследуется Serializeable. + тебе уязвимость.
И то верно, но это исключительный пример. Уверен, что есть какая-нибудь апач утила для подобного)

UPD: в commonslang (SerializationUtils) есть подобное, но скорее всего с Serializable та же фигня (не уверен) :/
 
И то верно, но это исключительный пример. Уверен, что есть какая-нибудь апач утила для подобного)

UPD: в commonslang (SerializationUtils) есть подобное, но скорее всего с Serializable та же фигня (не уверен) :/
та же фигня.

юзайте gson, он быстрее нативной сериализации.
 
Ну а если так, то, вот примерчик:
PHP:
        Serializers.INSTANCE.register(Location.class, new Serializer<Location>()
        {

            @Override
            public Location read(final ByteArrayDataInput input)
            {
                return new Location(
                        Bukkit.getWorld(input.readUTF()), input.readDouble(), input.readDouble(), input.readDouble(), input.readFloat(), input.readFloat()
                );
            }

            @Override
            public void write(final Location obj, final ByteArrayDataOutput out)
            {
                out.writeUTF(obj.getWorld().getName());
                out.writeDouble(obj.getX());
                out.writeDouble(obj.getY());
                out.writeDouble(obj.getZ());
                out.writeFloat(obj.getYaw());
                out.writeFloat(obj.getPitch());
            }
        });
        // Записываем локацию в массив байт.
        final Location test = new Location(Bukkit.getWorld("world"), 100, 50, 100);
        final ByteArrayDataOutput bado = ByteStreams.newDataOutput();
        Serializers.INSTANCE.get(Location.class).write(test, bado);
        // Делаем с массивом все, что душе угдоно.
        final byte[] yourData = bado.toByteArray();
        // Считываем локацию из массива
        final ByteArrayDataInput badi = ByteStreams.newDataInput(yourData);
        final Location output = Serializers.INSTANCE.get(Location.class).read(badi);
        // Делаем с локацией все, что захотим.
PHP:
public final class Serializers
{
    public static final Serializers INSTANCE = new Serializers();
    private final Map<Class<?>, Serializer> serializersMap = Maps.newHashMap();

    private Serializers()
    {}

    public <T> void register(final Class<T> clazz, final Serializer<T> serializer)
    {
        Preconditions.checkNotNull(clazz, "class");
        Preconditions.checkNotNull(serializer, "serializer");
        this.serializersMap.put(clazz, serializer);
    }

    public <T, V extends Serializer<T>> V get(final Class<? extends T> clazz)
    {
        return (V) this.serializersMap.get(clazz);
    }

    public void unregister(final Class<?> clazz)
    {
        this.serializersMap.remove(clazz);
    }
}
PHP:
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;

public interface Serializer<T>
{
    T read(final ByteArrayDataInput input);

    void write(final T obj, final ByteArrayDataOutput out);
}
 
Ну а если так, то, вот примерчик:
PHP:
        Serializers.INSTANCE.register(Location.class, new Serializer<Location>()
        {

            @Override
            public Location read(final ByteArrayDataInput input)
            {
                return new Location(
                        Bukkit.getWorld(input.readUTF()), input.readDouble(), input.readDouble(), input.readDouble(), input.readFloat(), input.readFloat()
                );
            }

            @Override
            public void write(final Location obj, final ByteArrayDataOutput out)
            {
                out.writeUTF(obj.getWorld().getName());
                out.writeDouble(obj.getX());
                out.writeDouble(obj.getY());
                out.writeDouble(obj.getZ());
                out.writeFloat(obj.getYaw());
                out.writeFloat(obj.getPitch());
            }
        });
        // Записываем локацию в массив байт.
        final Location test = new Location(Bukkit.getWorld("world"), 100, 50, 100);
        final ByteArrayDataOutput bado = ByteStreams.newDataOutput();
        Serializers.INSTANCE.get(Location.class).write(test, bado);
        // Делаем с массивом все, что душе угдоно.
        final byte[] yourData = bado.toByteArray();
        // Считываем локацию из массива
        final ByteArrayDataInput badi = ByteStreams.newDataInput(yourData);
        final Location output = Serializers.INSTANCE.get(Location.class).read(badi);
        // Делаем с локацией все, что захотим.
PHP:
public final class Serializers
{
    public static final Serializers INSTANCE = new Serializers();
    private final Map<Class<?>, Serializer> serializersMap = Maps.newHashMap();

    private Serializers()
    {}

    public <T> void register(final Class<T> clazz, final Serializer<T> serializer)
    {
        Preconditions.checkNotNull(clazz, "class");
        Preconditions.checkNotNull(serializer, "serializer");
        this.serializersMap.put(clazz, serializer);
    }

    public <T, V extends Serializer<T>> V get(final Class<? extends T> clazz)
    {
        return (V) this.serializersMap.get(clazz);
    }

    public void unregister(final Class<?> clazz)
    {
        this.serializersMap.remove(clazz);
    }
}
PHP:
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;

public interface Serializer<T>
{
    T read(final ByteArrayDataInput input);

    void write(final T obj, final ByteArrayDataOutput out);
}
Юзабельно, но некоторые вещи так не сериализовать)

В некоторых проектах использую именно этот метод (естественно, так не углублялся)
 
nbt всегда готов к сериализации с упаковкой в гзип.

Код:
        ByteBuf buf = Unpooled.buffer();
        PacketBuffer pbuf = new PacketBuffer(buf);
        NBTTagCompound nbt = new NBTTagCompound();
        NBTTagList nbtlist = new NBTTagList();
        nbtlist.appendTag(new NBTTagString("one"));
        nbtlist.appendTag(new NBTTagString("two"));
        nbt.setTag("list", nbtlist);
        pbuf.writeCompoundTag(nbt);
Спасибки нотчу.
 
Назад
Верх