Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

как сериализовать массив
Список форумов
 ->  Сериализация (Serialization API)


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Alex13 : 40
Новичок
Откуда: Томск

СообщениеАвг 10, 2007 14:08 
Ответить с цитатой
Можно ли как то за раз сериализовать массив, например String a[5], чтобы потом также быстро его десериализовать в в массив String b[5]
Или все такие нужно по одному элементу вытаскивать ?
К началу Посмотреть профиль Отправить личное сообщение
шкипер : 1960
Java Developer
Откуда: Харьков

СообщениеАвг 10, 2007 14:43 
Ответить с цитатой
http://rustud.ru/informatika/gl8/Glava18/Index9.htm

Модифицированный пример:
Код:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

class MyClass implements Serializable {
   MyClass(String f1, int f2, double f3) {
      this.f1 = f1;
      this.f2 = f2;
      this.f3 = f3;
   }

   public String toString() {
      String ret = "f1: " + f1
         + ", f2: " + f2
         + ", f3: " + f3;
      return ret;
   }

   private String f1;
   private int f2;
   private double f3;
}

public class test {
   public static void main(String argv[]) throws Exception {
      MyClass me = new MyClass("abc",  -12,  5.67e-5);
      int[] arr = {10, 20, 30};
      ObjectOutputStream oos = new ObjectOutputStream(
      new FileOutputStream("myobjects.ser")) ;

      oos.writeObject(me);
      oos.writeObject(arr);
      oos.writeObject("Some string");
      oos.writeObject (new Date());
      oos.flush();

      ObjectInputStream ois = new ObjectInputStream(
      new FileInputStream("myobjects.ser"));
      MyClass mcl = (MyClass)ois.readObject();
      int[] a = (int[])ois.readObject();
      String s = (String)ois.readObject();
      Date d = (Date)ois.readObject();

      System.out.println(mcl);
      for (int i = 0; i < a.length; i++) {
         System.out.println("a[" + i + "] = " + a[i]);
      }
      System.out.println(a);
      System.out.println(s);
      System.out.println(d);

   }
}

_________________

aka ur6lad
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Shreder : 101
Новичок
Откуда: Kharkov, Ukraine

СообщениеИюн 02, 2008 23:18 
Ответить с цитатой
Не серьезно, человеку массив нужен а не холдер.

2. Сделай бин с массивом. А лучше преобразуй массив к ArrayList и пиши его в файл или куда еще.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Майоров Павел : 1460
Java Developer

СообщениеИюн 03, 2008 5:31 
Ответить с цитатой
Здесь массив и показан.

Смотри внимательнее:
Код:

      int[] arr = {10, 20, 30};
      oos.writeObject(arr);
      int[] a = (int[])ois.readObject();


Массив - это тоже объект, и его сериализация ничем не отличается от сериализации объекта.
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Shreder : 101
Новичок
Откуда: Kharkov, Ukraine

СообщениеИюн 27, 2008 13:02 
Ответить с цитатой
Ну на самом деле не совсем "тот-же обьект".
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
шкипер : 1960
Java Developer
Откуда: Харьков

СообщениеИюн 27, 2008 13:20 
Ответить с цитатой
Shreder писал(а):
Ну на самом деле не совсем "тот-же обьект".

В данном случае это не важно - "тот же" или "тот да не тот".
_________________

aka ur6lad
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Майоров Павел : 1460
Java Developer

СообщениеИюн 27, 2008 14:13 
Ответить с цитатой
Заметьте, я писал не "тот же", а "тоже"!
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Vlad : 1670
JavaTalks Team Member
Откуда: ODS-KRK-LON-HFE

СообщениеИюн 30, 2008 13:20 
Ответить с цитатой
Shreder писал(а):
Не серьезно, человеку массив нужен а не холдер.

2. Сделай бин с массивом. А лучше преобразуй массив к ArrayList и пиши его в файл или куда еще.

Был поставлен вполне конкретный вопрос, и шкипер ответил исчерпывающе поясняющим примером. Shreder, если считаете, что что-то неправильно, покажите как правильно, если считаете, что ответ неполный - дополните!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Shreder : 101
Новичок
Откуда: Kharkov, Ukraine

СообщениеИюл 01, 2008 13:17 
Ответить с цитатой
В общем так предыдущий код был написан с горячя и по быстрому. Тперь нормальный.

Код:
import static org.junit.Assert.assertEquals;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.After;
import org.junit.Test;

public class TestCase {

   private List<Integer> convert(final int[] arr) {
      List<Integer> list = new ArrayList<Integer>();
      for (int i : arr) {
         list.add(new Integer(i));
      }
      return list;
   }

   private int[] convert(final List<Integer> list) {
      int arr[] = new int[list.size()];
      for (int i = 0; i < list.size(); i++) {
         arr[i] = list.get(i);
      }
      return arr;
   }

   @SuppressWarnings("unchecked")
   @Test
   public void test() throws Exception {
      int arr1[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
      int arr2[] = null;

      ArrayList<Integer> list = (ArrayList<Integer>)convert(arr1);

      ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(
            new File("temp.ser")));
      os.writeObject(list);
      os.close();

      list = null;
      ObjectInputStream is = new ObjectInputStream(new FileInputStream(
            new File("temp.ser")));
      
      list = (ArrayList<Integer>) is.readObject();
      arr2 = convert(list);
      is.close();

      assertEquals(arr1[7], arr2[7]);
   }
   
   @Test
   public void xmlTest() throws Exception {
      int arr1[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
      int arr2[] = null;

      ArrayList<Integer> list = (ArrayList<Integer>)convert(arr1);
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File("temp.xml")));
      XMLEncoder encoder = new XMLEncoder(out);
      encoder.writeObject(list);
      encoder.close();
      
      list = null;
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File("temp.xml")));
      XMLDecoder decoder = new XMLDecoder(in);
      list = (ArrayList<Integer>) decoder.readObject();
      arr2 = convert(list);
      assertEquals(arr1[7], arr2[7]);
      decoder.close();
   }
   
   @After
   public void tearDone() {
      File file = new File("temp.ser");
      file.delete();
      file = new File("temp.xml");
      file.delete();
   }
}


P.S. Зачем делать приведение к колекции видно во втором тесткейсе.


Последний раз редактировалось: Shreder (Июл 03, 2008 15:30), всего редактировалось 1 раз
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vlad : 1670
JavaTalks Team Member
Откуда: ODS-KRK-LON-HFE

СообщениеИюл 01, 2008 16:43 
Ответить с цитатой
1. Зачем создавать дополнительный объект типа ArrayList, если надо только сериализовать массив, который и юез оберток отлично сериализуется, тем более, что при создании?

2. У Вас куча "опечаток" и лишней нагрузки в примере, как: ArrayList<Integer>; пропущенное приведение типов; ненужное создание лишней коллекции после вызова Arrays.asList; в конце концов вызов метода Arrays.asList вернет список с одним элеменентом типа int[], и соответственно такой список нельзя передать в конструктор ArrayList<Integer>. ArrayList

В общем, ArrayList никаким образом не относится к решению поставленной Alex13 задаче.

П.С. Так что, Shreder, мне почистить конец дискусии или удалите сами свой пост? Wink
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vermut : 1063
Завсегдатай
Откуда: Ростов-на-Дону

СообщениеНоя 19, 2008 15:19 
Ответить с цитатой
Vlad писал(а):
1. Зачем создавать дополнительный объект типа ArrayList, если надо только сериализовать массив, который и юез оберток отлично сериализуется, тем более, что при создании?

2. У Вас куча "опечаток" и лишней нагрузки в примере, как: ArrayList<Integer>; пропущенное приведение типов; ненужное создание лишней коллекции после вызова Arrays.asList; в конце концов вызов метода Arrays.asList вернет список с одним элеменентом типа int[], и соответственно такой список нельзя передать в конструктор ArrayList<Integer>. ArrayList

В общем, ArrayList никаким образом не относится к решению поставленной Alex13 задаче.

П.С. Так что, Shreder, мне почистить конец дискусии или удалите сами свой пост? Wink


Полностью согласен с Vladom пост Shredera необходимо удалить потому, что он вводит в заблуждение и без того немногих начинающих изучать Java, проведём небольшой тест
Код:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class TestClass implements Serializable
{public int TestField;
 
}

public class SerialWriteArrayTest {

public static void main(String[] args) throws IOException
{
      String Message="Vlad прав массив можно сериализовать и десериализовать одной операцией так же как простой объект ";
      String FalseMessage="Vlad не прав массив нельзя сериализовать  и десериализовать одной операцией так же как простой объект ";
      boolean TrueTest=true;
      TestClass[] TestArray=new TestClass[20];
       for(int i=0;i<20;i++)
          {   TestArray[i]=new TestClass();
             TestArray[i].TestField=i;
          }
       
       try
          {   FileOutputStream file=new FileOutputStream("c:\\X.file");
             ObjectOutput out = new ObjectOutputStream(file);
             out.writeObject(TestArray);
             out.close();
             file.close();
          }
      catch(IOException e)
          {}
      
      try
         {
            ObjectInputStream in =new ObjectInputStream(new FileInputStream("c:\\X.file"));
            Object obj=in.readObject();
            TestArray=(TestClass[])obj;
             in.close();
         }
      catch(ClassNotFoundException e)
       {
         System.out.println(FalseMessage);
         System.out.println("Возникла ошибка при десереализации, так как нельзя десериализовать сразу массив");
      }
      for(int i=0;i<20;i++)
         if(TestArray[i].TestField==i)
            System.out.print(TestArray[i].TestField+"; ");
         else
            {TrueTest=false;
             break;
            }
     if(TrueTest==false)Message=FalseMessage;
     System.out.println("\n"+Message);
   }
}

Вот вывод программы
Цитата:


0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19;
Vlad прав массив можно сериализовать и десериализовать одной операцией так же как простой объект
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Shreder : 101
Новичок
Откуда: Kharkov, Ukraine

СообщениеНоя 24, 2008 15:51 
Ответить с цитатой
Удаляйте если хотите. Суть этого всего только в том, что будут неприятности в случае, если вы попытаетесь десериализовать массив из Java 1.6 из под Java 1.5, 1.4 или вообще из JVM не от Sun например IBM (а такая ситуация встречается весьма часто) если не приведете его к XML.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
nazica : 1519
Администратор
Откуда: Donetsk, UA

СообщениеНоя 24, 2008 17:29 
Ответить с цитатой
скажите, а какие неприятности могут быть?
_________________
Software and cathedrals are much the same - first we build them, then we pray
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Vermut : 1063
Завсегдатай
Откуда: Ростов-на-Дону

СообщениеНоя 24, 2008 18:45 
Ответить с цитатой
Shreder писал(а):
Удаляйте если хотите. Суть этого всего только в том, что будут неприятности в случае, если вы попытаетесь десериализовать массив из Java 1.6 из под Java 1.5, 1.4 или вообще из JVM не от Sun например IBM (а такая ситуация встречается весьма часто) если не приведете его к XML.

Да вы правы, но если задумываться о вечном, то и XML не помощник. Тогда уж собстенноручно написанные SaveToOutputStream, LoadFromInputStream. И то нет гарантий, что с появлением китайских JVM , будет работать.
_________________
Познакомлюсь с привлекательной Ростовчанкой для совместного изучения Java
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
nazica : 1519
Администратор
Откуда: Donetsk, UA

СообщениеНоя 24, 2008 18:58 
Ответить с цитатой
Так какие проблемы могут возникать? То, что сериализованное одной ЖВМ не будет десериализовываться из другой? Так это вполне естественно.
_________________
Software and cathedrals are much the same - first we build them, then we pray
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Сериализация (Serialization API)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru