Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 27.09.2013
Сообщений: 30
1

Сериализация и десериализация объекта в байты и текст

19.10.2014, 18:53. Просмотров 1360. Ответов 1
Метки нет (Все метки)


Мира вам.
Перейду сразу к сути задания, цитата из методички:
Кликните здесь для просмотра всего текста

Создайте отдельный класс Buildings, работающий со ссылками типа Space, Floor, Building, содержащий статические методы ввода-вывода зданий:
  • записи данных о здании в байтовый поток public static void outputBuilding (Building building, OutputStream out);
  • чтения данных о здании из байтового потока public static Building inputBuilding (InputStream in);
  • записи здания в символьный поток public static void writeBuilding (Building building, Writer out);
  • чтения здания из символьного потока public static Building readBuilding (Reader in).

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

    Например, символьная запись для трехэтажного здания:
    «3 2 3 150.0 2 100.0 1 3 250.0 3 2 140.0 1 60.0 1 50.0»

    Для байтовой записи/чтения рекомендуется воспользоваться потоками-обертками DataInputStream, DataOutputStream.
    Для символьной записи – потоком-оберткой PrintWriter. Для чтения этажа из символьного потока рекомендуется использовать класс StreamTokenizer.
    Проверьте возможности всех реализованных методов, в качестве реальных потоков используя файловые потоки, а также потоки System.in и System.out

Space, Floor и Building - это интерфейсы. Прикрепляю на всякий древо проекта, чтобы видеть кто их реализует.

Внимание вопрос.
Как мне собрать все данные с файла в объекты типа Building, если это интерфейс? (та же проблема со Space и Floor)

Вообще сериализация у меня реализована, но не так как просит преподаватель.
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class Test_app {
 
    //region Buildings
    protected static OfficeBuilding officeBuilding = null;
    protected static Dwelling dwelling = null;
    //endregion
 
    public static void main(String[] args) {
        try {
            initBuildings();
            objectSerialization();
            //initBuildingTest();
            //initOfficeFloorTest();
            //initOfficeBuildingTest();
        }
        catch (Exception exp) {
            out.println(exp.getMessage());
        }
    }
 
    //region Serialisation
 
    public static void objectSerialization() throws IOException, ClassNotFoundException {
 
        String officeBuildingName = "OfficeBuilding.obj";
        String dwellingBuildingName = "DwellingBuilding.obj";
 
        printBuilding(officeBuilding);
        printBuilding(dwelling);
 
        ObjectSerialization objFile = new ObjectSerialization();
 
        objFile.write(officeBuildingName, officeBuilding);
        officeBuilding = null;
        officeBuilding = (OfficeBuilding) objFile.read(officeBuildingName);
 
        objFile.write(dwellingBuildingName, dwelling);
        dwelling = null;
        dwelling = (Dwelling) objFile.read(dwellingBuildingName);
 
        printBuilding(officeBuilding);
        printBuilding(dwelling);
    }
}
 
public  class ObjectSerialization {
    public void write(String filename, Object o) throws IOException {
        FileOutputStream fos = new FileOutputStream(filename);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(o);
        oos.flush();
        oos.close();
    }
 
    public Object read(String filename) throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(filename);
        ObjectInputStream oin = new ObjectInputStream(fis);
        Object o = oin.readObject();
        oin.close();
        return o;
    }
}

Что получилось из того что просит преподаватель? Получилась только запись (надеюсь на это), потому что здесь всё достаточно просто - прошёлся по объектам, записал. А вот создать объекты по записям как-то ума не хватает.
Листинг класса Buildings (название согласно заданию):
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
public class Buildings {
 
    //Для байтовой записи/чтения рекомендуется воспользоваться потоками-обертками DataInputStream, DataOutputStream.
    //записи данных о здании в байтовый поток
    //public static void outputBuilding (Building building, OutputStream out);
    public static void outputBuilding(Building building, OutputStream out) throws IOException {
        DataOutputStream dos = new DataOutputStream(out);
        dos.writeInt(building.floorCount());
        for (Object floorObj : building.getFloors()) {
            Floor floor = (Floor) floorObj;
            dos.writeInt(floor.spaceCount());
            for (Object spaceObj : floor.getSpaces()) {
                Space space = (Space) spaceObj;
                dos.writeInt(space.getRoomCount());
                dos.writeDouble(space.getArea());
            }
 
        }
        dos.close();
    }
 
    //чтения данных о здании из байтового потока
    //public static Building inputBuilding (InputStream in);
    public static Building inputBuilding(InputStream in) throws IOException {
        DataInputStream dis = new DataInputStream(in);
        Building building = null;
        int floorCount = dis.readInt();
        Floor[] floors = new Floor[floorCount];
//        for (int i = 0; i < floorCount; i++) {
//            int spacesCount = dis.readInt();
//            Space[] spaces = new Space[spacesCount];
//
//            for (int j = 0; j < spacesCount; j++) {
//                int roomCount = dis.readInt();
//                double area = dis.readDouble();
//                spaces[j] = new Space(area, roomCount) {
//                };
//            }
//
//            floors[i] = new Floor(spaces);
//        }
//        building = new OfficeBuilding(floors);
        dis.close();
        return (Building) building;
    }
 
    //записи здания в символьный поток
    //public static void writeBuilding (Building building, Writer out);
    // Для символьной записи – потоком-оберткой PrintWriter.
    public static void writeBuilding (Building building, Writer out){
        PrintWriter pw = new PrintWriter(out);
        int i = 0;
        for (Object o : building.getFloors()) {
            Floor floor = (Floor) o;
            String s = "";
            s += (floor.spaceCount() + " ");
            for (Object o1 : floor.getSpaces()) {
                Space space = (Space) o1;
                s += space.getRoomCount() + " " + space.getArea() + " ";
            }
            s += "\r\n";
            System.out.println(s);
            pw.print(s);
            i++;
        }
        pw.close();
    }
 
    //чтения здания из символьного потока
    //public static Building readBuilding (Reader in)
    //Для чтения этажа из символьного потока рекомендуется использовать класс
    // StreamTokenizer.
    public static Building readBuilding (Reader in){
        OfficeBuilding building = null;
        return (Building) building;
    }
}
 
//Примечание. Записанные данные о здании представляет собой последовательность чисел, первым из которых
//является количество этажей, далее следует количество помещений текущего этажа и соответствующие значения количества
//комнат и площадей помещений текущего этажа.
//Например, символьная запись для трехэтажного здания:
//«3 2 3 150.0 2 100.0 1 3 250.0 3 2 140.0 1 60.0 1 50.0»
//
// Проверьте возможности всех реализованных методов, в качестве реальных потоков используя файловые потоки,
// а также потоки System.in и System.out.
//
// Задание 2
// Модифицировать классы помещений, этажей и зданий таким образом, чтобы они были сериализуемыми.
// Продемонстрировать возможности сериализации в методе main(),
// записав в файл объект, затем считав и сравнив его с исходным (по сохраненным значениям).


Светлые идеи приветствуются. Не очень светлые тоже)
0
Миниатюры
Сериализация и десериализация объекта в байты и текст  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2014, 18:53
Ответы с готовыми решениями:

Gson. Сериализация/десериализация с сохранением типов данных
Добрый вечер Использую GSon. При десеариализации данных из JSON структура класса к которому...

Gson десериализация объекта в объекте
Всем привет, не могу сообразить как сделать... есть класс: public class Message { private...

Сериализация работает(вроде), а десериализация - нет
Всем привет. Я написал некую программу на Java, при первом запуске которой с консоли вводятся...

Сериализация/десериализация. Null вместо полей
Добрый вечер. Есть следующие классы: Connector - для записи/считывания из файла, Human - родитель...

1
1 / 1 / 0
Регистрация: 27.09.2013
Сообщений: 30
19.10.2014, 19:01  [ТС] 2
Ну и вдруг, для совсем самоотверженных
Link to github.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2014, 19:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Десериализация объекта из файла
Хотел написать простой дневник тренировок, всё вроде бы удалось, но возникли проблемы с считиванием...

Сериализация объекта в ByteArray
Есть ли возможность сериализации объекта в массив байтов , с последующей десериализацией, без...

Сериализация/Десериализация
В общем пытаюсь сохранить список, вылезает такое: An unhandled exception of type...

Сериализация и десериализация
Есть класс: public class FilesData : ISerializable //класс, содержащий файлы { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.