1

別のシリアライゼーションの質問がありますが、今回はバイナリにシリアライズするときの 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 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302) at BinaryS.main(BinaryS.java: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 ファイルをダウンロードする必要があることに気づきませんでした。今すぐ簡単に修正できます! ご協力いただきありがとうございます!

4

2 に答える 2

4

推測では、ここに記載されているように、GeneralTreeはSerializableマーカーインターフェイスを実装していません。

実際には、ツリーに格納しているオブジェクトがシリアル化できない可能性もあります。コレクションは、その中のすべての要素も同様である場合にのみシリアル化できます。

于 2008-12-12T21:22:33.537 に答える
0

編集:GeneralTreeと書かれていることは知っていますが、クラスの開始時にそれを入れました

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

これは何の役にも立たない - タイプRandomTreeBuilderのオブジェクトをオブジェクト ストリームに書き込もうとしているわけではない。書き込もうとしている型はGeneralTreeであり、 Serializableを実装する必要があるのはそのクラスです。


参考までに、シリアライゼーションの多くの秘訣と注意点については、この記事をご覧ください: Discover the secret of the Java Serialization API .

于 2008-12-13T13:07:24.313 に答える