2010-11-08 1 views
3

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

+3

сериализация не требуется конструктор без аргументов. –

+2

Да, да. См. Спецификацию сериализации объектов и комментарий Тома Хотина. – EJP

+1

EJP, это не правильно, и Стив Куо. См. Http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#4539. Ваш сериализуемый класс * должен * «иметь доступ к конструктору no-arg его первого несериализуемого суперкласса». Другими словами, если вы просматриваете дерево наследования по отношению к объекту, то первый несериализуемый класс, который вы видите, должен иметь не-частный конструктор noarg. Еще впереди ... –

ответ

0

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

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

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

+0

Да, существует много объектов 3-х партийных классов (к источнику которых у меня нет доступа) в дереве, который я хочу сериализовать. – Vladimir

2

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

PS Это не имеет зависимости от других вещей JBoss, это просто один из библиотеки низкого уровня JBoss вырвались как отдельный проект.

0

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

к сожалению, нет. Все объекты Сериализуемые м ust осуществлять 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

Elite, этот код демонстрирует, как сериализовать и десериализовать, но суть вопроса в том, как сделать ваш сериализуемый класс, так что, когда экземпляр вашего класса передается методу toByteArray, который вы написали выше, не будет NotSerializableException , –

+0

@Concrete Gannet, как я сказал в своем сообщении (пожалуйста, прочитайте), только путем расширения «Serializable» ваш класс сможет вводить сериализацию. –

0

Eishay Смит сделал a benchmarking of Java serializers который включает в себя некоторые information about each one, хотя это не говорит, не используют ли они без аргументов конструктора (и во многих случаях, они надевают» t даже работать с произвольными объектами, поэтому вопрос спорный). Это может стоить взгляда.

+0

Я ничего не вижу о конструкторах. – EJP

+0

Вы правы, нет ничего об этом на этой странице - отредактировано соответствующим образом. Где-то, связанный с этим проектом, есть более подробное описание каждого инструмента, включая такие вещи. Я не могу найти его. –

1

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

Я бы этого не хотел.

+0

+1 для крайне ненужного мышления. – Philip

0

И Databoard, он может сериализовать классы в стиле бит, стиль записи и неизменный стиль. Вы также можете написать собственную внешнюю привязку класса.

0

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

0

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

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

  1. Serializeble без конструктора без аргументов, как проходит Object с с конструктором без аргументов

    public class MySerializableClass implements Serializable { 
        public MySerializableClass (...)... 
    } 
    
  2. Serializeble без конструктора без аргументов, как проходит MyFirstClass с с конструктором без аргументов

    public class MyFirstClass { 
    } 
    public class MySecondClass extends MyFirstClass implements Serializable { 
        public MySecondClass (...)... 
    } 
    
  3. NOT serializeble as MyFirstClass не применяется Serializable И не имеет конструктора по умолчанию.

    public class MyFirstClass { 
        public MyFirstClass (...)... 
    } 
    public class MySecondClass extends MyFirstClass implements Serializable { 
        public MySecondClass (...)... 
    } 
    
Смежные вопросы