Как сериализовать и десериализовать kdtree в java

У меня есть kdtree, узлы которого состоят из следующих полей: общедоступный статический класс Node реализует Serializable {

    public int discriminator;
    public double value; 

    public Node leftChild;
    public Node rightChild;
    public DataPoint object;
    }

где определение DataPoint:

общедоступный статический класс DataPoint реализует Serializable { public Comparable X; общедоступный сопоставимый Y; общедоступный сопоставимый Z;

     public double latitude;
     public double longitude;

     public ArrayList<String> text = new ArrayList<String>(); 
     }

Я хочу сериализовать дерево, сохранить в файле и десериализовать, отвечая на запросы диапазона. Мое понимание этой концепции сериализации не в порядке. Из того, что я собрал, я написал следующие функции, которые не работают. Кто-нибудь может помочь?

 public static void serialize(final OutputStream out, kdtrees.Node node) throws IOException
 {
        if( node == null ) 
        {
            //out.write( "()".getBytes() );
            //write to an output leaf file
            out.write("#".getBytes());

        } 
        else 
        {
            //out.write( "(".getBytes() );
            ((ObjectOutputStream) out).writeObject(node);
            serialize( out, node.leftChild );
            serialize( out, node.rightChild );
            //out.write( ")".getBytes( ) );
        }
    }


 public static kdtrees.Node deserialize(final ObjectInputStream reader) throws IOException, ClassNotFoundException 
 {

                  StringTokenizer st = new StringTokenizer(reader.readObject().toString()); 
                  String curToken = st.nextToken().toString();
                  while(st.hasMoreTokens())
                  { 
                      if(curToken.equals("#".trim()))
                          return null;


                      kdtrees.Node e = (kdtrees.Node)reader.readObject();

                       e.leftChild = deserialize(reader);
                       e.rightChild = deserialize(reader);

                    return e;

                  }
               return null;   


    } 

person Esha Ghosh    schedule 05.01.2013    source источник
comment
никакая работа не помогает. Пожалуйста, будьте более конкретными.   -  person Oliver Charlesworth    schedule 05.01.2013
comment
Компилируется нормально, но дерево не восстанавливается. Он возвращает ноль.   -  person Esha Ghosh    schedule 05.01.2013


Ответы (1)


Приведение произвольного OutputStream к ObjectOutputStream просто не удастся. Вместо этого используйте new ObjectOutputStream(outputStream) для создания оболочки вокруг OutputStream и то же самое для InputStream.

person Louis Wasserman    schedule 05.01.2013
comment
Не могли бы вы немного уточнить? Извините, я новичок в Java. - person Esha Ghosh; 05.01.2013
comment
Эм. Вместо ((ObjectOutputStream) out), write new ObjectOutputStream(out). Same goes for the input streams. Also, there's no need to call serialize(out, node.leftChild)` или serialize(out, node.rightChild); дети будут автоматически сериализованы с родительским узлом. - person Louis Wasserman; 05.01.2013