Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись объекта в rms 
V
    Опции темы
Brodyaga
Дата 30.10.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Всем доброго времени суток! Можно ли каким-нибудь образом записать объект в rms? Или как получить набор байт объекта?
PM MAIL   Вверх
ecologist
Дата 30.10.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: нет
Всего: 9



А в инете поискать не получается ?
http://developers.sun.com/mobility/midp/articles/persist/

PM MAIL   Вверх
Dummy
Дата 30.10.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(ecologist @  30.10.2008,  11:53 Найти цитируемый пост)
А в инете поискать не получается ?
http://developers.sun.com/mobility/midp/articles/persist/

Да, можно так smile Но можно и не так. Можно написать общую реализацию, которая будет легко расширяема и на другие предметные области. Увы, ObjectOutputStream нам в стандартном комплекте не далиsmile Но и самому сериализацию написать несложно. Например, эта статья рассказывает и показывает, как это сделать. После того, как мы реализовали свой Object[Output|Input]Stream - достаточно в любом классе, представляющего предметную область, реализовать интерфейс Serializable - и мы получаем искомый результат.

Еще есть такая библиотечка. Не пробовал, но, судя по API, который она дает, - то, что доктор прописал.

Или можно еще портировать ObjectOutputStream из исходников Java SE, но там много и, пожалуй, чересчур сложно для небольшой задачи.

Замечательный API дает Polish: J2ME polish serialization, но, прежде чем привязываться к Polish ради одной только сериализации, стоит сто раз подумать, тем более если создаваемое приложение коммерческое...

PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

А в инете поискать не получается ?
http://developers.sun.com/mobility/midp/articles/persist/


В этой статье показан пример с записью строки в rms... А как объект то записать? Мне свой класс нужно записать в rms...
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  30.10.2008,  12:56 Найти цитируемый пост)
В этой статье показан пример с записью строки в rms... А как объект то записать? Мне свой класс нужно записать в rms... 

Мои ответы игнорируют, да? smile 
PM MAIL   Вверх
AntonSaburov
Дата 30.10.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Но класс же все равно надо сериализовать - сделать его Serializable может и  хватит
PM MAIL WWW ICQ   Вверх
Brodyaga
Дата 30.10.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Нет smile)))))))) Их сейчас смотрю... Просто ты написал, что
Цитата

Да, можно так smile 


А так совсем и нельз получается? Просто это самый лёгкий способ, вот и хотел узнать, может действительно както так и можно исхитрица? или всётаки я прав по поводу того, что этот вариант только для строк подходит?

Добавлено через 3 минуты и 13 секунд
Цитата

Но класс же все равно надо сериализовать - сделать его Serializable может и  хватит

в J2ME нет Serializable класса... так что буду смотреть вариант Dummy...
PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Чтото я не понял в этом примере...
Цитата

Например, эта статья рассказывает и показывает, как это сделать.

...каким макаром запись объекта получается...

Цитата


 int valor=14
 Antonio ant=null;
public void serialize(DataOutptuStream dos)
{
 dos.writeInt(this.valor);

 if(ant!=null)
 {
  dos.writeInt(9);
  
  dos.writeUTF(ant.getClass().getName());

  ((Serializable)ant).serialize(dos);

  dos.writeInt(0);
 }
}


Поясните плиз, Нафига имя класса записывается, а потом опять же этот метод вызывается... Поясните плиз?
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  30.10.2008,  13:16 Найти цитируемый пост)
А так совсем и нельз получается? Просто это самый лёгкий способ, вот и хотел узнать, может действительно както так и можно исхитрица? или всётаки я прав по поводу того, что этот вариант только для строк подходит?

На самом деле так, как описано в статье на http://developers.sun.com/mobility/midp/articles/persist/, делать можно для любого типа. Вопрос в том, нужно ли. К сожалению, в этой статье задача показана только на простейшем и не слишком полезном примере, когда тип объекта - String. К чему приведет попытка расширения такого решения:
  • Надо будет писать соответствующий метод для каждого нужного типа, который будет сериализовать объекты и писать их в RMS. 100 объектов - 100 методов для их сохранения? smile 
  • Мы создаем класс (в примере это StockDB), который жестко привязан к содержимому других классов, объекты которых он пишет в RMS. Он должен иметь доступ к значениям всех полей этих объектов, как на чтение (для сериализации), так и для записи (для десериализации.

ИМХО, такой дизайн нехорош, гораздо лучше доверить объекту самому представлять себе в виде последовательности байт. Как это сделать - я уже говорил .

PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

Мы создаем класс (в примере это StockDB), который жестко привязан к содержимому других классов, объекты которых он пишет в RMS. Он должен иметь доступ к значениям всех полей этих объектов, как на чтение (для сериализации), так и для записи (для десериализации.


Значит так нельзя?
Цитата

MyClass myClass;
outputStream.writeUTF(myClass);


Нужно только каждое свойство класс отдельно записывать?
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  30.10.2008,  13:58 Найти цитируемый пост)
Поясните плиз, Нафига имя класса записывается, а потом опять же этот метод вызывается... Поясните плиз? 

Имя класса пишется для того, чтобы можно было по нему потом создать инстанс класса. А в остальном - пожалуй, несколько странный там дизайн написан, я что-то проглядел smile Методы для чтения и записи разумно перенести в Object[Output| Input]Stream , примерно так (написано на коленке, так что не сильно придирайтесь):

Код

package com.brodyaga.io.*;

...

public class ObjectOutputStream extends DataOutputStream {
     public Object writeObject(Object obj) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
    if (obj == null) {
        throw new NullPointerException();
    }

     writeInt(9);
     writeUTF(obj.getClass().getName());
     ((Serializable )obj).serialize(this);
     writeInt(0);
}


Код

package com.brodyaga.io.*;

...

public class ObjectInputStream extends DataInputStream {
    public Object readObject() throws IOException, ClassNotFoundException {
        Object obj = null;
        int tmp = -1;

         tmp = this.dis.readInt();
         System.out.println("en recObjectInputStream, tmp = " + tmp);

         if (tmp == 9)  {
             obj = (Serializable)
             Class.forName(dis.readUTF()).newInstance();
             ((Serializable)obj).deserialize(dis);

              if (readInt() != 0) {
                  obj = null;
             }
        }

         return obj;
    }
}


Соответственно, мы создаем определяем интерфейс Serializable следующим образом:

Код

public interface Serializable {
    public void serialize(OutputStream os) throws ... <много-чего>;
    public void deserialize(InputStream is) throws ... <много-чего>;
}


и твой объект:

Код

public class SerializableObject implements Serializable {
    public void serialize(OutputStream os) throws ... <много-чего> {
        // пишем себя в поток
    }

    public void deserialize(InputStream is) throws ... <много-чего> {
        // читаем себя из потока
    }
}


Добавлено @ 14:35
Цитата(Brodyaga @  30.10.2008,  14:29 Найти цитируемый пост)

Значит так нельзя?
Цитата

MyClass myClass;
outputStream.writeUTF(myClass);

writeUTF() только строки принимает.

Добавлено @ 14:40
Да, и еще...
Цитата(Dummy @  30.10.2008,  12:10 Найти цитируемый пост)
Или можно еще портировать ObjectOutputStream из исходников Java SE, но там много и, пожалуй, чересчур сложно для небольшой задачи.

Это я точно погорячился))) Заглянул в исходники - там работа через Reflection идет, так что в J2ME это точно не получится. Вариант отпадает.


Это сообщение отредактировал(а) Dummy - 30.10.2008, 14:41
PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



ну это всё архитектура.. общий принцип таков: нужно получить байты значений свойств класса, слепить их, и закинуть в rms, а потом также последовательно считать, создать новый объект и закинуть их туда. Так?
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Да
PM MAIL   Вверх
MoZy
Дата 30.11.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: нет
Всего: 0



Но ведь какой бы сложности/вложенности классы ни были, базовых типов немного.. реализовать для каждого такого типа функцию дампа.. а в конечном классе (и всех вложенных), в Основной процедуре дампа, составить нужную сиквенцию вызовов для каждой значимой переменной. Читать так же..
Где сложность? непонятно  smile 

Это сообщение отредактировал(а) MoZy - 30.11.2008, 23:24
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
Dummy
Дата 1.12.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(MoZy @  30.11.2008,  23:22 Найти цитируемый пост)
Но ведь какой бы сложности/вложенности классы ни были, базовых типов немного.. реализовать для каждого такого типа функцию дампа.. а в конечном классе (и всех вложенных), в Основной процедуре дампа, составить нужную сиквенцию вызовов для каждой значимой переменной. Читать так же..
Где сложность? непонятно  smile 

Прошу прощения, не понял, к чему это было написано и какую новую информацию содержит.
PM MAIL   Вверх
math64
Дата 1.12.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Для записи объекта можно реализовать метод toString() так чтобы он выдавал всю информацию об объекте, и записывать эту строку в rms. Для чтения создать конструктор с аргументом String.
PM   Вверх
zzzvyk
Дата 1.12.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.4.2007
Где: Киев

Репутация: нет
Всего: нет



Когда я столкнулся с данной проблемой, то за основу взял вот это
http://www.garret.ru/serme.html
Единственное, что мне не нравиться, это то, что не получиться использовать обфускатор для классов реализующих  данный интерфейс.
PM MAIL Skype   Вверх
Brodyaga
Дата 3.12.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

Для записи объекта можно реализовать метод toString() так чтобы он выдавал всю информацию об объекте, и записывать эту строку в rms. Для чтения создать конструктор с аргументом String.


Тоесть эти кракозяблики и есть объект!? Тоесть если я создам прочитаю это в объект то значения всех переменных сохранятся?
PM MAIL   Вверх
Dummy
Дата 3.12.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  3.12.2008,  13:13 Найти цитируемый пост)
Тоесть эти кракозяблики и есть объект!? 

Предположим, у тебя есть класс MyCoolIO в пакете com.brodyaga.io. По умолчанию MyCoolIO.toString() будет возвращать строку вида "com.brodyaga.io.MyCoolIO@12345678"? Эти кракозяблики ты имеешь в виду?

Это дефолтная реализация Object.toString(), которая к имени класса объекта (то, что в кракозябликах идет до символа "@") добавляет значение его хэша (после "@"). Никакой информации об объекте, кроме разве что имени класса, из него при десериализации извлечь не получится.

math64 имел в виду то, что ты для своего класса должен переопределить метод toString() таким образом, чтобы результирующая строка содержала информацию о классе и значениях его полей в некотором формате (ну, например, структуру класса в виде XML-документа или что-то поумнее).
PM MAIL   Вверх
Выхухоль
  Дата 3.12.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

Репутация: 2
Всего: 2



кстати ща тоже использую rms для хранения объектов , тока чото нифига не получается..

не могу понять в чем проблема в примере я сделал сериализацию для одного класса сама запись проходит на ура а десириализация не проходит...
Код

//Эти вещи инициализируются в конструкторе
RecordStore Services;
RecordEnumiration r_enum;

public CurentService[] GetServices()
    {
        CurentService[] result =null;    
        if(DataStore.IsCreate(Constants.ServicesStoreName))
        {
       
        r_enum.reset();    
         result =  new CurentService[r_enum.numRecords()];
        DataOutputStream dos;
       
        for(int i=0;i<r_enum.numRecords();i++)
        {         
            try {

                result[i] = DeSerialize(r_enum.nextRecord());
            } catch (InvalidRecordIDException ex) {
                ex.printStackTrace();
            } catch (RecordStoreNotOpenException ex) {
                ex.printStackTrace();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            }
        }
        }
        return result;
    }
    
    public void SetServices(CurentService[] CurS)
    {        
        r_enum.reset();      
        for(;r_enum.hasNextElement();)
        {
            try {
                Services.deleteRecord(r_enum.nextRecordId());
            } catch (RecordStoreNotOpenException ex) {
                ex.printStackTrace();
            } catch (InvalidRecordIDException ex) {
                ex.printStackTrace();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            }
        }
        
       for(int i = 0;i<CurS.length;i++)
       {
          
            try {
                
                Services.addRecord(Serialize(CurS[i]), 0, Serialize(CurS[i]).length);
            } catch (RecordStoreNotOpenException ex) {
                ex.printStackTrace();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            } 
       }
    }
    
    private byte[] Serialize(CurentService Service) 
    {
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeBoolean(Service.IsActive());
            dos.writeInt(Service.getService_Id());
            dos.writeUTF(Service.getAlias());
            dos.writeUTF(Service.getDiscription());
            dos.writeUTF(Service.getOperation_Title());
            dos.writeUTF(Service.gettitle());
            //dos.flush();
           
        } catch (IOException ex) {
            ex.printStackTrace();
        }
         return baos.toByteArray();
    }
    
    private CurentService DeSerialize(byte[] arr)
    {
        CurentService Service = null;
        try {
            
            ByteArrayInputStream bais = new ByteArrayInputStream(arr);
            DataInputStream dis = new DataInputStream(bais);

            String title = dis.readUTF();
            String opar_Title = dis.readUTF();
            String Discript = dis.readUTF();
            String Alias = dis.readUTF();
            int ID = dis.readInt();
            boolean IsActive = dis.readBoolean();
            Service = new CurentService(ID, title, opar_Title, Discript, Alias, IsActive);

            
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return Service;
    }


в строке DeSerialize String Discript = dis.readUTF(); вылетает EOFException почему????????? Ну вообщемто ясен файл закончился токо опять же ПОЧЕМУ??никак не въеду ужо три часа маюся... smile


Это сообщение отредактировал(а) Выхухоль - 3.12.2008, 20:10
PM MAIL ICQ   Вверх
eugine_s
Дата 3.12.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Ты в каком порядке сохраняешь поля объекта?

Код

            dos.writeBoolean(Service.IsActive());
            dos.writeInt(Service.getService_Id());
            dos.writeUTF(Service.getAlias());
            dos.writeUTF(Service.getDiscription());
            dos.writeUTF(Service.getOperation_Title());
            dos.writeUTF(Service.gettitle());


Вот в таком порядке и доставай их: т.е. сначала Boolean, потом Int а потом 4-ре UTF (ну и эти строки alias, title - тоже читай в том порядке в каком записывал.

Код

            boolean IsActive = dis.readBoolean();
            int ID = dis.readInt();
            String Alias = dis.readUTF();
            String Discript = dis.readUTF();
            String opar_Title = dis.readUTF();
            String title = dis.readUTF();

            

Советую посмотреть на пример обычной java (j2se), открыть поток к файлу и записать в него Int, Bool, UTF - и посмотреть потом в редакторе что в этот файл записалось..

Да, и еще одно, в конце сериализации dos.flush() - раскоментируй назад.

PM MAIL   Вверх
Выхухоль
Дата 4.12.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

Репутация: 2
Всего: 2



eugine_s, пасиба  smile  то что нужно..
да просто дебил на форуме отписал , а я  с его примера и делаю...там у него было сериализация в одном порядке а десир в другом...вот и доверяй после этого людям =(
PM MAIL ICQ   Вверх
W0LF
Дата 4.12.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата(Выхухоль @  4.12.2008,  17:25 Найти цитируемый пост)
да просто дебил на форуме отписал 

 
M
W0LF
Выхухоль, давайте не будем оскорблять людей здесь. Просто иногда людям свойственно ошибаться. Нужно просто помимо тупого копипаста не лениться, а подключать и свой мозг, если же реально непонятно - тогда Вам здесь обязательно по возможности помогут.
Спасибо за понимание.


Это сообщение отредактировал(а) W0LF - 4.12.2008, 22:49


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Выхухоль
Дата 6.12.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

Репутация: 2
Всего: 2



W0LF, ОК не буим...


Цитата(W0LF @  4.12.2008,  22:47 Найти цитируемый пост)
Нужно просто помимо тупого копипаста не лениться, а подключать и свой мозг

ток ты сам меня не оскорбляй если можно...
прозвучало раз в пять хуже чем если бы ты меня назвал просто дебилом..
PM MAIL ICQ   Вверх
W0LF
Дата 8.12.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



 smile 
 smile вот для того, чтоб так не звучало, как Вы озвучили и было добавлено - 
Цитата

не лениться

никоим образом обидеть не хотел


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.