Использование java.io.Serializable при реализации дерева? - PullRequest
1 голос
/ 13 декабря 2008

У меня есть ДРУГОЙ вопрос о сериализации, но на этот раз это касается собственного импорта сериализации 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 (BinaryS.java:24)

edit: я знаю, что там написано 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, что легко исправить! Спасибо за вашу помощь!

Ответы [ 2 ]

4 голосов
/ 13 декабря 2008

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

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

0 голосов
/ 13 декабря 2008

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

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

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...