Использование java.io.Serializable при реализации дерева?

У меня есть ДРУГОЙ вопрос о сериализации, но на этот раз это касается собственного импорта сериализации Java при сериализации в двоичный файл. Я должен сериализовать случайное дерево, которое генерируется в другом файле Java. Я знаю, как работает сериализация и десериализация, но пример, которому я следовал, когда использовал двоичную сериализацию с java.io.Serializable, работал не так, как когда я делал это, скажем, с простым объектом. Вот мой сегмент кода:

import java.io.*;
import java.io.FileInputStream;

public class BinaryS 
    {

    public static void main(String[] args) {
        Tree randomTree = RandomTreeBuilder.randomTree(10);

        FileOutputStream fOut=null;
        ObjectOutputStream oOut=null;

        try{
            fOut= new FileOutputStream("/Users/Pat/programs/binaryfile.txt");
            oOut = new ObjectOutputStream(fOut);
            oOut.writeObject(randomTree); //serializing randomTree
            System.out.println("An employee is serialized into /Users/Pat/binaryfile.txt");
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try {
                oOut.flush();
                oOut.close();
                fOut.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
});

Я считаю, что проблема заключается в том, когда я использую writeObject (randomTree). Я получаю некоторые терминальные исключения, когда это происходит ... они ниже:

java.io.NotSerializableException: GeneralTree в java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1081) в java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:302) в BinaryS.main:24.

редактировать: я знаю, что это говорит GeneralTree, но в начале класса это было в я положил

print("public class RandomTreeBuilder implements java.io.Serializable");

затем GeneralTree находится под ним

print(" protected static Tree tree;
protected static ArrayList names;
//e6.1

/**
 *Builds a random tree.  The build method does the work.
 */
//b6.2
public static Tree randomTree(int n) {
    // Create a random binary tree with n external nodes
    tree = new GeneralTree();
    names = NameGenerator.getNames();
    build(tree.getRoot(), n);  // auxiliary recursive method
    return tree;

«);

Обновление: Эй, ребята, я разобрался с собственной проблемой, оказалось, что я идиот и не понял, что мне нужно было загрузить дополнительный файл .java, что легко исправить! Спасибо за вашу помощь!

12.12.2008 21:19:46
2 ОТВЕТА

По-видимому, GeneralTree не реализует интерфейс маркера Serializable , как описано здесь .

На самом деле, это могут быть также объекты, которые вы храните в дереве, которые нельзя сериализировать. Коллекция является сериализуемой только в том случае, если все элементы в ней тоже.

4
12.12.2008 21:28:43

редактировать: я знаю, что это говорит GeneralTree, но в начале класса это было в я положил

print("public class RandomTreeBuilder implements java.io.Serializable");

Это бесполезно - вы не пытаетесь записать объект типа RandomTreeBuilder в поток объекта; тип, который вы пытаетесь написать - это GeneralTree, и именно этот класс должен реализовывать Serializable .


К вашему сведению: в случае, если вы с этим не сталкивались, в этой статье рассматриваются многие хитрости и недостатки сериализации: откройте секреты Java Serialization API .

0
13.12.2008 13:07:24