Библиотека сериализации Java без необходимости использования конструкторов без аргументов и реализации Serializable - PullRequest
3 голосов
/ 08 ноября 2010

Есть ли способ в java-мире для сериализации без использования конструкторов без аргументов и реализации Serializable?

Ответы [ 9 ]

2 голосов
/ 08 ноября 2010

Сериализация JBoss является заменой стандартной сериализации Java, которая не требует реализации java.io.Serializable. Помимо этого (и факта, что он намного быстрее), он такой же, как стандартный механизм сериализации (он даже использует те же интерфейсы ObjectInput и ObjectOutput.

P.S. Он не зависит от других компонентов JBoss, это всего лишь одна из низкоуровневых библиотек JBoss, выделенных в отдельный проект.

1 голос
/ 09 ноября 2010

Ужасным способом сделать это было бы создание параллельной иерархии классов, каждый из которых заменяет один из классов в сторонней иерархии, каждый из которых реализует Externalizable, и записывает себя, записывая соответствующие поля изсторонний объект.

Я бы не стал.

1 голос
/ 08 ноября 2010
0 голосов
/ 28 июля 2016

См. http://www.jguru.com/faq/view.jsp?EID=251942 объяснение.

Единственное требование к конструктору для класса, который реализует Serializable, заключается в том, что первый несериализуемый суперкласс в его иерархии наследования должен иметь конструктор без аргументов.

  1. Сериализуемый без конструктора без аргументов, расширяемого Object с конструктором без аргументов

    public class MySerializableClass implements Serializable {
       public MySerializableClass (...)...
    }
    
  2. Сериализуемый без конструктора без аргументов, расширяемый MyFirstClass с конструктором без аргументов

    public class MyFirstClass {
    }
    public class MySecondClass extends MyFirstClass implements Serializable {
       public MySecondClass (...)...
    }
    
  3. НЕ сериализуемо, так как MyFirstClass не реализовано Serializable И не имеет конструктора по умолчанию.

    public class MyFirstClass {
       public MyFirstClass (...)...
    }
    public class MySecondClass extends MyFirstClass implements Serializable {
       public MySecondClass (...)...
    }
    
0 голосов
/ 02 февраля 2012

Есть ряд альтернатив, как говорили другие люди.Если вы хотите придерживаться стандартной Java-сериализации с writeObject и readObject, вы можете написать свой собственный класс адаптера, который наследуется от стороннего класса, реализовать Serializable для вашего собственного класса и переопределить writeObject и readObject, другими словами, реализовать пользовательскую сериализациюваш класс.

0 голосов
/ 10 ноября 2010

И Панель данных , она может сериализовать классы bean-style, record-style и неизменяемого стиля. Вы также можете написать собственную внешнюю привязку к классу.

0 голосов
/ 08 ноября 2010

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

0 голосов
/ 08 ноября 2010

... и реализация Serializable?

К сожалению, нет.Все сериализуемые объекты должны реализовать java.io.Serializable.Что касается первой части вопроса, вы можете использовать ObjectInputStream / ObjectOutputStream для сериализации объектов в байтовый массив и наоборот.

В следующем примере показано, как:

public static byte[] toByteArray(Object object) throws IOException {
        if (!isSerializable(object)) {
            throw new IOException("Object '" + object.getClass().getName() + "' is not serializable.");
        }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
    } finally {
        if (oos != null) {
            try {
                oos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                logger.error("Closing of ObjectOutputStream failed.", e);
            }
        }
    }

    return baos.toByteArray();
}

public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
    Object object = null;
    ObjectInputStream ois = null; 

    try {
        ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
        object = ois.readObject();
    } finally {
        if (ois != null) {
            try {
                ois.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                logger.error("Closing of ObjectInputStream failed.", e);
            }
        }
    }

    return object;
}
0 голосов
/ 08 ноября 2010

Я считаю, что в некоторых случаях вы можете принудительно сериализоваться, несмотря на объявления Type. Однако существует риск, поскольку у класса могут быть поля, которые нельзя сериализовать, что вызовет исключения во время выполнения.

Мне любопытно, поскольку вы получаете бесплатные конструкторы по умолчанию без аргументов, если только вы не написали собственные конструкторы. Также для Serializable требуется 30 секунд поиска / замены.

Есть ли причина, по которой вы пытаетесь избежать этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...