public static void writeWorkItem(MarshallerWriteContext context, WorkItem workItem)
      throws IOException {
    ObjectOutputStream stream = context.stream;
    stream.writeLong(workItem.getId());
    stream.writeLong(workItem.getProcessInstanceId());
    stream.writeUTF(workItem.getName());
    stream.writeInt(workItem.getState());

    // Work Item Parameters
    Map<String, Object> parameters = workItem.getParameters();
    Collection<Object> notNullValues = new ArrayList<Object>();
    for (Object value : parameters.values()) {
      if (value != null) {
        notNullValues.add(value);
      }
    }

    stream.writeInt(notNullValues.size());
    for (String key : parameters.keySet()) {
      Object object = parameters.get(key);
      if (object != null) {
        stream.writeUTF(key);

        ObjectMarshallingStrategy strategy =
            context.objectMarshallingStrategyStore.getStrategyObject(object);
        String strategyClassName = strategy.getClass().getName();
        stream.writeInt(-2); // backwards compatibility
        stream.writeUTF(strategyClassName);
        if (strategy.accept(object)) {
          strategy.write(stream, object);
        }
      }
    }
  }
 @PreUpdate
 public void update() {
   this.state = workItem.getState();
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   try {
     MarshallerWriteContext context = new MarshallerWriteContext(baos, null, null, null, null);
     OutputMarshaller.writeWorkItem(context, workItem);
     context.close();
     this.workItemByteArray = baos.toByteArray();
   } catch (IOException e) {
     throw new IllegalArgumentException(
         "IOException while storing workItem " + workItem.getId() + ": " + e.getMessage());
   }
 }