Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Простой способ глубокого клонирования?


Автор: oson 16.3.2011, 18:54
Подскажите пожалуйста, есть ли в 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#?


Автор: XoJIoD 16.3.2011, 21:07
Примерно тоже самое только на 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());
    }

}

Автор: oson 23.3.2011, 19:50
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)