private static void toString(Writer buffer, ViewComponentInfo mv, int depth)
      throws java.io.IOException {
    for (int i = 0; i < depth; i++) {
      buffer.write("  ");
    }

    buffer.write(mv.viewType + " ");
    buffer.write(mv.visible ? "V" : "");
    buffer.write(mv.isShown ? "S" : "");
    buffer.write(mv.hasFocus ? "F" : "");
    buffer.write(mv.isInputMethodTarget ? "T" : "");
    buffer.write(mv.hasOnClickListener() ? "L" : "");
    buffer.write(mv.isContainer ? "C" : "");
    buffer.write(" ");
    buffer.write(String.valueOf(mv.drawingTime));
    buffer.write("<");
    buffer.write(Integer.toString(mv.x));
    buffer.write(",");
    buffer.write(Integer.toString(mv.y));
    buffer.write(",");
    buffer.write(Integer.toString(mv.width));
    buffer.write(",");
    buffer.write(Integer.toString(mv.height));
    buffer.write(",");
    buffer.write(Integer.toString(mv.measuredWidth));
    buffer.write(",");
    buffer.write(Integer.toString(mv.measuredHeight));
    buffer.write(",");
    buffer.write(Integer.toString(mv.scrollX));
    buffer.write(",");
    buffer.write(Integer.toString(mv.scrollY));
    buffer.write(",");
    buffer.write(Integer.toString(mv.absoluteX));
    buffer.write(",");
    buffer.write(Integer.toString(mv.absoluteY));
    buffer.write(">");

    if (mv.isEditText) {
      buffer.write(String.valueOf(mv.getInputMethod()));
      buffer.write(" ");
      buffer.write(mv.getTextContent());
    }
    buffer.write("\n");

    if (mv.children == null) return;

    for (ViewComponentInfo child : mv.children) {
      toString(buffer, child, depth + 1);
    }
  }
  private static void readFrom(ObjectInput o, ViewComponentInfo v)
      throws IOException, ClassNotFoundException {
    v.x = o.readInt();
    v.y = o.readInt();
    v.width = o.readInt();
    v.height = o.readInt();
    v.measuredWidth = o.readInt();
    v.measuredHeight = o.readInt();
    v.scrollX = o.readInt();
    v.scrollY = o.readInt();
    v.absoluteX = o.readInt();
    v.absoluteY = o.readInt();
    v.cameraDistance = o.readFloat();
    v.visible = o.readBoolean();
    v.drawingTime = o.readLong();
    v.isShown = o.readBoolean();
    v.hasFocus = o.readBoolean();
    v.focusable = o.readBoolean();
    v.hasOnClickListener = o.readBoolean();
    v.viewType = (String) o.readObject();
    v.textContent = (String) o.readObject();
    v.isEditText = o.readBoolean();
    v.isInputMethodTarget = o.readBoolean();
    v.isContainer = o.readBoolean();
    v.inputMethod = o.readInt();
    v.id = o.readInt();

    int size = o.readInt();
    if (size != 0) {
      v.children = new LinkedList<ViewComponentInfo>();
      for (int i = 0; i < size; i++) {
        ViewComponentInfo c = new ViewComponentInfo();
        readFrom(o, c);
        v.children.add(c);
      }
    }
  }