SlideShare a Scribd company logo
1 of 43
Download to read offline
Углубленное
программирование
на Java
Лекция 7
«Resource System»
Виталий Чибриков
План лекции
1. Serialization
2. Reflection
3. SAX & DOM
4. Resource System

2
Сериализация
Перевод объекта в формат данных удобный для хранения и передачи
Процесс должен быть обратимым

Объект

Метаданные

3
Сериализация
Примеры сериализации
Запись в бинарный файл
Запись в xml файл

Запись в json string
Запись blob в базу данных
Пересылка по сети между
процессами
Описание объекта в стихах и пересылка почтовым голубем

4
interface Serializable
Обьект класса реализующего интерфейс Serializable можно
сериализовать
Результат сериализации ― массив байт

Обычно объекты сериализуют в файл, в blob или в сетевой поток

Процесс сериализации:
Создание потока представляющего направление сериализации
Создание ObjectOutputStream для этого потока

5
Что будет сериализовано
Все поля сериализуемого объекта должны быть Serializable
Все поля будут сериализованы
Поля родительских классов реализующих Serializable
будут сериализованы
Если родительский класс НЕ реализует Serializable,
то при десериализации для него будет вызван конструктор
по-умолчанию

6
Что НЕ будет сериализовано
Поле которое не надо сериализовать нужно пометить как transient
private transient long time;

Статические поля сериализваны НЕ будут
При десериализации static и transient поля будут заполнены
значениями по-умолчанию

7
transient
Примеры полей для которых нужен модификатор transient
private transient InputStream is;
private transient DBConnection connection;

На собеседованиях любят задавать странные вопросы
Например, в чем разница между transient и volatile?

8
Serialization Object
public class SerializationObject implements Serializable {
private String name;
private int age;

// name = Zoe
// age = 31

…
}

9
Запись в файл
SerializationObject object = new SerializationObject("Zoe", 31);
FileOutputStream fileOut = new FileOutputStream("test.bin");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(object);
out.close();

10
serialVersionUID
serialVersionUID – идентификатор версии класса
private static final long serialVersionUID = -3895203507200457730L;

UID нужно менять при каждом изменении полей класса
Если UID не задать явно – он будет вычислен в runtime, из хэша класса

11
Десериализация
Чтение происходит в обратном порядке
serialVersionUID
родительские классы

классы переменных родительских классов
объекты родительских классов
значения переменных родительских классов
классы переменных
значения переменных

12
План лекции
1. Serialization
2. Reflection
3. SAX & DOM
4. Resource System

13
Reflection
Возможность проверить структуру объекта в runtime
Возможность изменить поведение объекта в runtime
Сериализация
Serializable – пустой интерфейс
Мы не написали ни строчки кода для сериализации объекта
Reflection разбирает объект и переводит его в массив байт

14
Используя Reflection можно
Получить список переменных класса
Получить список методов класса
Получить список конструкторов класса
Создать объект, вызвав его конструктор
Вызвать метод

Поменять область видимости переменной или метода

15
Используя Reflection нельзя
Добавить или удалить переменную или метод
Поменять область видимости до компиляции

16
Reflection и тестирование
Тестирование «белого ящика»
Возможность проверить значения private полей
Возможность поменять значения private полей

Создание «облака» объектов

17
Минусы Reflection
Если задачу можно решить без reflection ―
ее лучше решить без reflection
Потеря производительности
Не работает в окружении с повышенной безопасностью (applet-ы)

Разрушение ОО архитектуры

18
java.lang.Class
Class ― объект, который представляет в runtime данные о классе объекта
Основные методы класса Class
static Class<T> forName(String className)
String getCanonicalName()

Fields[] getField(String name)
Class[] getInterfaces()
Method[] getMethods()
Constructor[] getConstructors()

19
java.lang.Class
Как получить Class<?> объект
Class<?> clazz = object.getClass()

Class<?> clazz = className.class

//в том числе для простых типов

Class<?> clazz = Class.forName(“java.io.Serializable”)
Class[] clases = clazz.getInterfaces()

20
java.lang.reflect.Member
java.lang.reflect.Member – интерфейс членов класса
Классы реализующие интерфейс Member
Field
Method
Constructor

21
ReflectionHelper
public static Object createIntance(String className){
try {
return Class.forName(className).newInstance();
} catch (…){…}
}

22
ReflectionHelper
public static void setFieldValue(Object object, String fieldName, String value){
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
if(field.getType().equals(String.class)){
field.set(object, value);
} else if ( field.getType().equals(int.class)){
field.set(object, Integer.decode(value));
}
field.setAccessible(false);
} catch(…){…}
}

23
План лекции
1. Serialization
2. Reflection
3. SAX & DOM
4. Resource System

24
XML Serialization
Данные объекта ― иерархически упорядоченные поля
простых типов

XML документ ― иерархически упорядоченные тэги со строками

Имя переменной ― имя тэга

Значение переменной ― строковое значение тэга

25
Отличия XML
Занчительно проще редактировать
Значительно проще версионировать

Нет привязки к типу
Нет привязки к особенностям языка

Избыточна

Медленное чтение и запись

26
SAX parser
Simple API for XML (SAX)
Стандартное средство обработки XML документов
Обходит XML дерево

Посещает каждую ноду дерева
Для каждой ноды вызывает 3 callback-а

27
SAX parser
Порядок работы:
Читаем формат документа

Читаем первый тэг ― сообщаем приложению, что обработка начата
Читаем содержимое тэга
Сообщаем приложению содержимое тэга
Рекурсивно обращаемся ко всем вложенным тэгам
Сообщаем приложению, что обработка завершена

28
SAX parser методы
org.xml.sax.helpers.DefaultHandler

Методы для обработки тегов во время обхода документа:
startDocument()
startElement(…)
characters(…)
endElement(…)
endDocument()

Обход дерева

29
Десериализация XML
Задача:
Разработать XML формат для документа так чтобы
Можно было понять класс десериализуемого объекта
Тэг с именем переменной содержал
Атрибуты для восстановления переменной

Значение переменной
Записать ресурсы игры в выбранном формате

30
Простой XML документ
<class type=“main.SerializationObject”>
<name>Zully</name>
<age>23</age>
</class>

31
Handler
public class SaxEmptyHandler extends DefaultHandler {
private static String CLASSNAME = "class";
private boolean inElement = false;

public void startElement(String uri, String localName, String qName, Attributes attributes) {
System.out.println("Start element: " + qName);
if(qName != CLASSNAME)
inElement = true;
else
System.out.println("Class name: " + attributes.getValue(0));
}
public void endElement(String uri, String localName, String qName) {
System.out.println("End element: " + qName);
inElement = false;
}
public void characters(char ch[], int start, int length) {
if(inElement)
System.out.println("Process : " + new String(ch, start, length));
}
}

32
Используем Reflection
public void startElement(String uri, String localName, String qName, Attributes attributes) {
if(qName != CLASSNAME){
element = qName;
}
else {
String className = attributes.getValue(0);
System.out.println("Class name: " + className);
object = ReflectionHelper.createIntance(className);
}
}
public void endElement(String uri, String localName, String qName) {
element = null;
}
public void characters(char ch[], int start, int length) {
if(element != null){
String value = new String(ch, start, length);
System.out.println(element + " = " + value);
ReflectionHelper.setFieldValue(object, element, value);
}
}

33
DOM parser
Document Object Model
Сначала прочитаем весь XML, потом обойдем все ноды

javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.DocumentBuilder
org.w3c.dom.Document

File fXmlFile = new File(“test.xml”);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
34
SAX & DOM сравнение
SAX parser

DOM parser

SAX (Simple API for XML) парсер не создает никакой
DOM (Document Object Model) парсер создает древовидную
внутренней структуры. Вместо этого, он берет все вхождения структуру в памяти из входящего документа и лишь потом
компонентов во входящем документе в виде событий (events) ждет запросов от клиента.
и говорит клиенту что он читает, поскольку он читает через
входящий документ.
SAX парсер всегда отдает клиенту лишь куски документа.

Всегда отдает клиенту целый документ, независимо от того,
сколько в действительности необходимо пользователю.

Менее требователен к ресурсам и занимаемому свободному
месту в случае использования больших входящих
документов (потому что он не создает внутренней
структуры). Также он запускается быстрее и более легок в
изучении, чем DOM парсер.

Имеет богатый функционал. Создает DOM-дерево в памяти и
позволяет доступаться к любой части документа, а также
модифицировать его. Но он не рационально распоряжается
свободным местом в случае использования огромных
документов.

Используйте в следующих случаях:
Используйте в следующих случаях:
 Входящий документ слишком велик для доступной
 Вашему приложению необходимо иметь доступ к
памяти
различным частям документа и использование
 Когда необходимо прочитать лишь небольшой участок
собственной структуры столь же сложно, как и
документа.
использование дерева DOM.
 Используя SAX, вы используете меньшее количество
 Вашему приложению необходимо изменять дерево
памяти и производите меньше динамических
очень часто и данные должны быть сохранены на
резерваций памяти.
определенный период времени.
35
План лекции
1. Serialization
2. Reflection
3. SAX & DOM
4. Resource System

36
Resource
Resource ― интерфейс для всех объектов со статическими данными
Конкретный ресурс можно собрать на основе XML документа

Ресурс одного типа может быть описан несколькими
XML документами
Уникальность игрового ресурса ― путь к его XML файлу

XML документы для ресурсов создают дизайнеры
Все параметры игры должны быть в ресурсах

37
Resource Systen
Ресурсная система
XML файлы с описанием игровых объектов
Инструменты для редактирования XML файлов

Инструменты для создания игровых объектов по ресурсам

38
Resource Systen
В Allods Online
3 года разработки

> 200 000 ресурсов
Загрузка всех ресурсов примерно пол часа
На разработке ресурсной системы 2 программиста
На разработке редакторов 3 программиста
Ресурсы создавали > 10 дизайнеров

39
ResourceFactory
ResourceFactory – фабрика ресурсов
Возвращает объект ресурса по пути к XML файлу

40
ДЗ
Вынести все параметры в XML файлы
Создать interface Resource и class GameSessionResource
Создать class ResourceFactory (singleton)

GameSessionResource resource =
(GameSessionResource) ResourceFactory.instance().get(“./GameResource.xml”)

41
ResourceSystem *
Загрузка всех ресурсов при старте сервера
Используем VFS.instance().getIterator(“./data”)

Все ресурсы храним в директории ./data
Обходим все файлы и создаем все ресурсы
Ресурсы храним в Map<String, Resource>

42
Спасибо за внимание
Виталий Чибриков
chibrikov@corp.mail.ru

More Related Content

What's hot

Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8Technopark
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Fedor Malyshkin
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7Technopark
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействиеUnguryan Vitaliy
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7Technopark
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Aleksey Mashanov Rit
Aleksey  Mashanov RitAleksey  Mashanov Rit
Aleksey Mashanov Ritrit2010
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.Igor Shkulipa
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода выводаmetaform
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построенияGennady Zavyalov
 

What's hot (19)

Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Aleksey Mashanov Rit
Aleksey  Mashanov RitAleksey  Mashanov Rit
Aleksey Mashanov Rit
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Gradle
GradleGradle
Gradle
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построения
 

Similar to Java осень 2013 лекция 7

Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...it-people
 
массивы Php
массивы Phpмассивы Php
массивы PhpVasya Petrov
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Mail.ru Group
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.Igor Shkulipa
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9Technopark
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Ldap And Infrastructure
Ldap And InfrastructureLdap And Infrastructure
Ldap And InfrastructureLiudmila Li
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)Sergey Skvortsov
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 

Similar to Java осень 2013 лекция 7 (20)

function_docs.pdf
function_docs.pdffunction_docs.pdf
function_docs.pdf
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
 
массивы Php
массивы Phpмассивы Php
массивы Php
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
лек13 3
лек13 3лек13 3
лек13 3
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Ldap And Infrastructure
Ldap And InfrastructureLdap And Infrastructure
Ldap And Infrastructure
 
Backbone js
Backbone jsBackbone js
Backbone js
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 

More from Technopark

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...Technopark
 

More from Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 

Java осень 2013 лекция 7

  • 2. План лекции 1. Serialization 2. Reflection 3. SAX & DOM 4. Resource System 2
  • 3. Сериализация Перевод объекта в формат данных удобный для хранения и передачи Процесс должен быть обратимым Объект Метаданные 3
  • 4. Сериализация Примеры сериализации Запись в бинарный файл Запись в xml файл Запись в json string Запись blob в базу данных Пересылка по сети между процессами Описание объекта в стихах и пересылка почтовым голубем 4
  • 5. interface Serializable Обьект класса реализующего интерфейс Serializable можно сериализовать Результат сериализации ― массив байт Обычно объекты сериализуют в файл, в blob или в сетевой поток Процесс сериализации: Создание потока представляющего направление сериализации Создание ObjectOutputStream для этого потока 5
  • 6. Что будет сериализовано Все поля сериализуемого объекта должны быть Serializable Все поля будут сериализованы Поля родительских классов реализующих Serializable будут сериализованы Если родительский класс НЕ реализует Serializable, то при десериализации для него будет вызван конструктор по-умолчанию 6
  • 7. Что НЕ будет сериализовано Поле которое не надо сериализовать нужно пометить как transient private transient long time; Статические поля сериализваны НЕ будут При десериализации static и transient поля будут заполнены значениями по-умолчанию 7
  • 8. transient Примеры полей для которых нужен модификатор transient private transient InputStream is; private transient DBConnection connection; На собеседованиях любят задавать странные вопросы Например, в чем разница между transient и volatile? 8
  • 9. Serialization Object public class SerializationObject implements Serializable { private String name; private int age; // name = Zoe // age = 31 … } 9
  • 10. Запись в файл SerializationObject object = new SerializationObject("Zoe", 31); FileOutputStream fileOut = new FileOutputStream("test.bin"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(object); out.close(); 10
  • 11. serialVersionUID serialVersionUID – идентификатор версии класса private static final long serialVersionUID = -3895203507200457730L; UID нужно менять при каждом изменении полей класса Если UID не задать явно – он будет вычислен в runtime, из хэша класса 11
  • 12. Десериализация Чтение происходит в обратном порядке serialVersionUID родительские классы классы переменных родительских классов объекты родительских классов значения переменных родительских классов классы переменных значения переменных 12
  • 13. План лекции 1. Serialization 2. Reflection 3. SAX & DOM 4. Resource System 13
  • 14. Reflection Возможность проверить структуру объекта в runtime Возможность изменить поведение объекта в runtime Сериализация Serializable – пустой интерфейс Мы не написали ни строчки кода для сериализации объекта Reflection разбирает объект и переводит его в массив байт 14
  • 15. Используя Reflection можно Получить список переменных класса Получить список методов класса Получить список конструкторов класса Создать объект, вызвав его конструктор Вызвать метод Поменять область видимости переменной или метода 15
  • 16. Используя Reflection нельзя Добавить или удалить переменную или метод Поменять область видимости до компиляции 16
  • 17. Reflection и тестирование Тестирование «белого ящика» Возможность проверить значения private полей Возможность поменять значения private полей Создание «облака» объектов 17
  • 18. Минусы Reflection Если задачу можно решить без reflection ― ее лучше решить без reflection Потеря производительности Не работает в окружении с повышенной безопасностью (applet-ы) Разрушение ОО архитектуры 18
  • 19. java.lang.Class Class ― объект, который представляет в runtime данные о классе объекта Основные методы класса Class static Class<T> forName(String className) String getCanonicalName() Fields[] getField(String name) Class[] getInterfaces() Method[] getMethods() Constructor[] getConstructors() 19
  • 20. java.lang.Class Как получить Class<?> объект Class<?> clazz = object.getClass() Class<?> clazz = className.class //в том числе для простых типов Class<?> clazz = Class.forName(“java.io.Serializable”) Class[] clases = clazz.getInterfaces() 20
  • 21. java.lang.reflect.Member java.lang.reflect.Member – интерфейс членов класса Классы реализующие интерфейс Member Field Method Constructor 21
  • 22. ReflectionHelper public static Object createIntance(String className){ try { return Class.forName(className).newInstance(); } catch (…){…} } 22
  • 23. ReflectionHelper public static void setFieldValue(Object object, String fieldName, String value){ try { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); if(field.getType().equals(String.class)){ field.set(object, value); } else if ( field.getType().equals(int.class)){ field.set(object, Integer.decode(value)); } field.setAccessible(false); } catch(…){…} } 23
  • 24. План лекции 1. Serialization 2. Reflection 3. SAX & DOM 4. Resource System 24
  • 25. XML Serialization Данные объекта ― иерархически упорядоченные поля простых типов XML документ ― иерархически упорядоченные тэги со строками Имя переменной ― имя тэга Значение переменной ― строковое значение тэга 25
  • 26. Отличия XML Занчительно проще редактировать Значительно проще версионировать Нет привязки к типу Нет привязки к особенностям языка Избыточна Медленное чтение и запись 26
  • 27. SAX parser Simple API for XML (SAX) Стандартное средство обработки XML документов Обходит XML дерево Посещает каждую ноду дерева Для каждой ноды вызывает 3 callback-а 27
  • 28. SAX parser Порядок работы: Читаем формат документа Читаем первый тэг ― сообщаем приложению, что обработка начата Читаем содержимое тэга Сообщаем приложению содержимое тэга Рекурсивно обращаемся ко всем вложенным тэгам Сообщаем приложению, что обработка завершена 28
  • 29. SAX parser методы org.xml.sax.helpers.DefaultHandler Методы для обработки тегов во время обхода документа: startDocument() startElement(…) characters(…) endElement(…) endDocument() Обход дерева 29
  • 30. Десериализация XML Задача: Разработать XML формат для документа так чтобы Можно было понять класс десериализуемого объекта Тэг с именем переменной содержал Атрибуты для восстановления переменной Значение переменной Записать ресурсы игры в выбранном формате 30
  • 31. Простой XML документ <class type=“main.SerializationObject”> <name>Zully</name> <age>23</age> </class> 31
  • 32. Handler public class SaxEmptyHandler extends DefaultHandler { private static String CLASSNAME = "class"; private boolean inElement = false; public void startElement(String uri, String localName, String qName, Attributes attributes) { System.out.println("Start element: " + qName); if(qName != CLASSNAME) inElement = true; else System.out.println("Class name: " + attributes.getValue(0)); } public void endElement(String uri, String localName, String qName) { System.out.println("End element: " + qName); inElement = false; } public void characters(char ch[], int start, int length) { if(inElement) System.out.println("Process : " + new String(ch, start, length)); } } 32
  • 33. Используем Reflection public void startElement(String uri, String localName, String qName, Attributes attributes) { if(qName != CLASSNAME){ element = qName; } else { String className = attributes.getValue(0); System.out.println("Class name: " + className); object = ReflectionHelper.createIntance(className); } } public void endElement(String uri, String localName, String qName) { element = null; } public void characters(char ch[], int start, int length) { if(element != null){ String value = new String(ch, start, length); System.out.println(element + " = " + value); ReflectionHelper.setFieldValue(object, element, value); } } 33
  • 34. DOM parser Document Object Model Сначала прочитаем весь XML, потом обойдем все ноды javax.xml.parsers.DocumentBuilderFactory javax.xml.parsers.DocumentBuilder org.w3c.dom.Document File fXmlFile = new File(“test.xml”); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); 34
  • 35. SAX & DOM сравнение SAX parser DOM parser SAX (Simple API for XML) парсер не создает никакой DOM (Document Object Model) парсер создает древовидную внутренней структуры. Вместо этого, он берет все вхождения структуру в памяти из входящего документа и лишь потом компонентов во входящем документе в виде событий (events) ждет запросов от клиента. и говорит клиенту что он читает, поскольку он читает через входящий документ. SAX парсер всегда отдает клиенту лишь куски документа. Всегда отдает клиенту целый документ, независимо от того, сколько в действительности необходимо пользователю. Менее требователен к ресурсам и занимаемому свободному месту в случае использования больших входящих документов (потому что он не создает внутренней структуры). Также он запускается быстрее и более легок в изучении, чем DOM парсер. Имеет богатый функционал. Создает DOM-дерево в памяти и позволяет доступаться к любой части документа, а также модифицировать его. Но он не рационально распоряжается свободным местом в случае использования огромных документов. Используйте в следующих случаях: Используйте в следующих случаях:  Входящий документ слишком велик для доступной  Вашему приложению необходимо иметь доступ к памяти различным частям документа и использование  Когда необходимо прочитать лишь небольшой участок собственной структуры столь же сложно, как и документа. использование дерева DOM.  Используя SAX, вы используете меньшее количество  Вашему приложению необходимо изменять дерево памяти и производите меньше динамических очень часто и данные должны быть сохранены на резерваций памяти. определенный период времени. 35
  • 36. План лекции 1. Serialization 2. Reflection 3. SAX & DOM 4. Resource System 36
  • 37. Resource Resource ― интерфейс для всех объектов со статическими данными Конкретный ресурс можно собрать на основе XML документа Ресурс одного типа может быть описан несколькими XML документами Уникальность игрового ресурса ― путь к его XML файлу XML документы для ресурсов создают дизайнеры Все параметры игры должны быть в ресурсах 37
  • 38. Resource Systen Ресурсная система XML файлы с описанием игровых объектов Инструменты для редактирования XML файлов Инструменты для создания игровых объектов по ресурсам 38
  • 39. Resource Systen В Allods Online 3 года разработки > 200 000 ресурсов Загрузка всех ресурсов примерно пол часа На разработке ресурсной системы 2 программиста На разработке редакторов 3 программиста Ресурсы создавали > 10 дизайнеров 39
  • 40. ResourceFactory ResourceFactory – фабрика ресурсов Возвращает объект ресурса по пути к XML файлу 40
  • 41. ДЗ Вынести все параметры в XML файлы Создать interface Resource и class GameSessionResource Создать class ResourceFactory (singleton) GameSessionResource resource = (GameSessionResource) ResourceFactory.instance().get(“./GameResource.xml”) 41
  • 42. ResourceSystem * Загрузка всех ресурсов при старте сервера Используем VFS.instance().getIterator(“./data”) Все ресурсы храним в директории ./data Обходим все файлы и создаем все ресурсы Ресурсы храним в Map<String, Resource> 42
  • 43. Спасибо за внимание Виталий Чибриков chibrikov@corp.mail.ru