|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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();
|
Массив - это тоже объект, и его сериализация ничем не отличается от сериализации объекта. |
|
|
|
 |
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 |
|
|
| Заметьте, я писал не "тот же", а "тоже"! |
|
|
|
 |
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, мне почистить конец дискусии или удалите сами свой пост?  |
|
|
|
 |
Vermut : 1063 Завсегдатай Откуда: Ростов-на-Дону
|
Ноя 19, 2008 15:19 |
|
|
| Vlad писал(а): |
1. Зачем создавать дополнительный объект типа ArrayList, если надо только сериализовать массив, который и юез оберток отлично сериализуется, тем более, что при создании?
2. У Вас куча "опечаток" и лишней нагрузки в примере, как: ArrayList<Integer>; пропущенное приведение типов; ненужное создание лишней коллекции после вызова Arrays.asList; в конце концов вызов метода Arrays.asList вернет список с одним элеменентом типа int[], и соответственно такой список нельзя передать в конструктор ArrayList<Integer>. ArrayList
В общем, ArrayList никаким образом не относится к решению поставленной Alex13 задаче.
П.С. Так что, Shreder, мне почистить конец дискусии или удалите сами свой пост?  |
Полностью согласен с 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 прав массив можно сериализовать и десериализовать одной операцией так же как простой объект |
|
|
|
|
 |
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 |
|
|
|
 |
Vermut : 1063 Завсегдатай Откуда: Ростов-на-Дону
|
Ноя 24, 2008 18:45 |
|
|
| Shreder писал(а): |
| Удаляйте если хотите. Суть этого всего только в том, что будут неприятности в случае, если вы попытаетесь десериализовать массив из Java 1.6 из под Java 1.5, 1.4 или вообще из JVM не от Sun например IBM (а такая ситуация встречается весьма часто) если не приведете его к XML. |
Да вы правы, но если задумываться о вечном, то и XML не помощник. Тогда уж собстенноручно написанные SaveToOutputStream, LoadFromInputStream. И то нет гарантий, что с появлением китайских JVM , будет работать. _________________ Познакомлюсь с привлекательной Ростовчанкой для совместного изучения Java |
|
|
|
 |
nazica : 1519 Администратор Откуда: Donetsk, UA
|
Ноя 24, 2008 18:58 |
|
|
Так какие проблемы могут возникать? То, что сериализованное одной ЖВМ не будет десериализовываться из другой? Так это вполне естественно. _________________ Software and cathedrals are much the same - first we build them, then we pray |
|
|
|
 |
|
|
|