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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простой способ глубокого клонирования? 
V
    Опции темы
oson
Дата 16.3.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подскажите пожалуйста, есть ли в Java возможность сделать глубокое копирование таким способом, как в C# при помощи классов
BinaryFormatter и MemoryStream
Код

 BinaryFormatter formatter= new BinaryFormatter();
 MemoryStream stream = new MemoryStream();
 formatter.Serialize(stream, clonObject);
 stream.Seek(0, SeekOrigin.Begin)
 formatter.Deserialize(stream);

То есть, чтобы избежать процесса разбора конкретного объекта и клонирования его полей, что можно сделать, насколько я понимаю, только при помощи reflection. Есть что-то подобное в Java типа приведенного кода C#?


PM MAIL   Вверх
XoJIoD
Дата 16.3.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Примерно тоже самое только на java), и только для сериализуемых классов.

Код

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Copy {

    private static class Foo implements Serializable {
        private int foo;

        public Foo(int foo) {
            super();
            this.foo = foo;
        }

        public void setFoo(int foo) {
            this.foo = foo;
        }

        public int getFoo() {
            return foo;
        }
    }

    private static class FooComposite implements Serializable {
        private Foo foo;

        public FooComposite(Foo foo) {
            super();
            this.foo = foo;
        }

        public void setFoo(Foo foo) {
            this.foo = foo;
        }

        public Foo getFoo() {
            return foo;
        }
    }

    private byte[] writeObject(Serializable obj) throws IOException,
            ClassNotFoundException {
        ObjectOutputStream objectOutputStream = null;
        try {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            objectOutputStream = new ObjectOutputStream(output);
            objectOutputStream.writeObject(obj);
            objectOutputStream.flush();
            return output.toByteArray();
        } finally {
            if (objectOutputStream != null)
                objectOutputStream.close();
        }
    }

    private Serializable readObject(byte[] buf) throws IOException,
            ClassNotFoundException {
        ObjectInputStream objectInputStream = null;
        try {
            objectInputStream = new ObjectInputStream(new ByteArrayInputStream(
                    buf));
            Serializable readObject = (Serializable) objectInputStream
                    .readObject();
            return readObject;
        } finally {
            if (objectInputStream != null)
                objectInputStream.close();
        }
    }

    public Serializable cloneObject(Serializable obj) throws IOException,
            ClassNotFoundException {
        return readObject(writeObject(obj));
    }

    public static void main(String[] args) throws IOException,
            ClassNotFoundException {

        Foo foo1 = new Foo(1);

        Copy copy = new Copy();
        Foo clone = (Foo) copy.cloneObject(foo1);

        System.out.println(foo1 == clone);
        System.out.println(foo1.getFoo() == clone.getFoo());
        System.out.println(foo1.getFoo());
        System.out.println(clone.getFoo());
        foo1.setFoo(2);
        System.out.println(foo1.getFoo());
        System.out.println(clone.getFoo());
        clone.setFoo(3);
        System.out.println(foo1.getFoo());
        System.out.println(clone.getFoo());

        FooComposite fooComposite = new FooComposite(foo1);
        FooComposite cloneFooComposite = (FooComposite) copy
                .cloneObject(fooComposite);

        System.out.println(fooComposite == cloneFooComposite);
        System.out.println(fooComposite.getFoo() == cloneFooComposite.getFoo());
        System.out.println(fooComposite.getFoo().getFoo() == cloneFooComposite
                .getFoo().getFoo());
    }

}

PM MAIL   Вверх
oson
Дата 23.3.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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