public ValueContainerImpl<T> read(final DataInput in) throws IOException {
      DataInputStream stream = (DataInputStream) in;
      final ValueContainerImpl<T> valueContainer = new ValueContainerImpl<T>();

      while (stream.available() > 0) {
        final int valueCount = DataInputOutputUtil.readSINT(in);
        if (valueCount < 0) {
          valueContainer.removeAllValues(-valueCount);
          valueContainer.setNeedsCompacting(true);
        } else {
          for (int valueIdx = 0; valueIdx < valueCount; valueIdx++) {
            final T value = myExternalizer.read(in);
            final int idCount = DataInputOutputUtil.readSINT(in);
            for (int i = 0; i < idCount; i++) {
              final int id = DataInputOutputUtil.readSINT(in);
              if (id < 0) {
                valueContainer.removeValue(-id, value);
                valueContainer.setNeedsCompacting(true);
              } else {
                valueContainer.addValue(id, value);
              }
            }
          }
        }
      }
      return valueContainer;
    }
 @Override
 public TIntArrayList read(final DataInput in) throws IOException {
   int size = DataInputOutputUtil.readSINT(in);
   if (size == Integer.MAX_VALUE) {
     return new TIntArrayList();
   } else if (size <= 0) {
     TIntArrayList result = new TIntArrayList(1);
     result.add(-size);
     return result;
   } else {
     TIntArrayList result = new TIntArrayList(size);
     for (int i = 0; i < size; i++) {
       result.add(DataInputOutputUtil.readINT(in));
     }
     return result;
   }
 }