Есть ли в Java литье, подобноев C ++ - PullRequest
6 голосов
/ 26 января 2011

Я получаю в своем сообщении функции массив байтов и тип объекта, мне нужно восстановить объект из байтов. Есть ли в Java приведение типа C ++?

Ответы [ 6 ]

7 голосов
/ 26 января 2011

Нет, вместо этого вы можете использовать сериализация .

5 голосов
/ 26 января 2011

В Java нет способа иметь произвольный блок байтов, а затем сказать компилятору «вам нужно обрабатывать это как объект типа X».

Как эти байты, которые вы хотите "восстановить в объект", были созданы в первую очередь?

В Java есть механизм сериализации для преобразования объектов в поток байтов и наоборот.

3 голосов
/ 26 января 2011

Я не совсем уверен, что вы спрашиваете здесь, но каждый объект в Java (и это включает в себя массивы) имеет информацию о типе времени выполнения, связанную с ним.Поэтому, когда вы приводите объект к другому типу, сразу же генерируется исключение, если новый тип не совпадает.Это сильно отличается от C / C ++, где вы можете просто сказать компилятору обрабатывать блок памяти как любой объект, которым вы хотите, чтобы он был.

Если вы ищете код для преобразования произвольного набора байтовв объект или наоборот, вам нужно будет сделать это по-другому, используя встроенные средства сериализации или развернув собственный код преобразования.

2 голосов
/ 26 января 2011

Нет, вам нужно сериализовать ваш объект. http://java.sun.com/developer/technicalArticles/Programming/serialization/

Это может быть бесполезно, если ожидается, что данные вашего объекта будут читаемыми на других языках.

0 голосов
/ 23 января 2019

reinterpret_cast можно моделировать в Java в достаточной степени, но не для прямой десериализации всего объекта. Как и предполагали другие, встроенный механизм сериализации Java или другие сторонние библиотеки сериализации будут вашим другом там, если вы сами не сможете позволить себе декомпозицию объекта в более простые типы на передающем конце.

Что касается конкретного вопроса о том, имеет ли Java эквивалент reinterpret_cast, то ответом будет частичное да. Если вы пытаетесь читать примитивы из потока двоичных данных, ByteBuffer ваш друг. Оберните его в массив байтов, скажите, являются ли данные прямым или старшим, а затем используйте различные методы для декодирования данных. Это может быть использовано для имитации различных преобразований C ++ reinterpret_cast из байтов в 32-разрядные целые числа или числа с плавающей запятой или что-либо еще.

0 голосов
/ 26 января 2011

вот методы для достижения того, что вы хотите.

public static Object toObjectFromByteArray(byte[] byteArr) {
        if (byteArr == null) {
            return null;
        }

        Object resultObj = null;
        ByteArrayInputStream bin = null;
        ObjectInputStream ooin = null;
        try {
            bin = new ByteArrayInputStream(byteArr);
            ooin = new ObjectInputStream(bin);
            resultObj = ooin.readObject();
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        finally {
            try {
                if (ooin != null) {
                    ooin.close();
                }
                if (bin != null) {
                    bin.close();
                }
            }
            catch (IOException ex1) {
                ex1.printStackTrace();
            }

        }
        return resultObj;
    }

    public static byte[] toByteArray(Object obj) {
        ByteArrayOutputStream barr = null;
        ObjectOutputStream oout = null;
        byte[] bytearr = null;
        try {
            byte[] b2 = null;
            barr = new ByteArrayOutputStream(10000);
            oout = new ObjectOutputStream(barr);
            oout.writeObject(obj);
            oout.flush();
            oout.close();
            bytearr = barr.toByteArray();

        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        finally {
            try {
                if (oout != null) {
                    oout.close();
                }
                if (barr != null) {
                    barr.close();
                }
            }
            catch (IOException ex1) {
                ex1.printStackTrace();
            }
        }
        return bytearr;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...