@Override
 public MutableFudgeMsg buildMessage(FudgeSerializer serializer, CalculationJobItem object) {
   MutableFudgeMsg msg = serializer.newMessage();
   ComputationTargetSpecification computationTargetSpecification =
       object.getComputationTargetSpecification();
   if (computationTargetSpecification != null) {
     MutableFudgeMsg specMsg = serializer.objectToFudgeMsg(computationTargetSpecification);
     for (FudgeField fudgeField : specMsg.getAllFields()) {
       msg.add(fudgeField);
     }
   }
   String functionUniqueIdentifier = object.getFunctionUniqueIdentifier();
   if (functionUniqueIdentifier != null) {
     msg.add(FUNCTION_UNIQUE_ID_FIELD_NAME, functionUniqueIdentifier);
   }
   FunctionParameters functionParameters = object.getFunctionParameters();
   if (functionParameters != null) {
     serializer.addToMessageWithClassHeaders(
         msg, FUNCTION_PARAMETERS_FIELD_NAME, null, functionParameters);
   }
   long[] inputs = object.getInputIdentifiers();
   msg.add(INPUT_FIELD_NAME, inputs);
   for (ValueRequirement desiredValue : object.getDesiredValues()) {
     serializer.addToMessage(msg, DESIRED_VALUE_FIELD_NAME, null, desiredValue);
   }
   return msg;
 }
 /**
  * Adds an object to the specified message if non-null. This handles object hierarchies.
  *
  * @param <T> the declared type
  * @param serializer the serializer, not null
  * @param msg the msg to populate, not null
  * @param fieldName the field name, may be null
  * @param value the value, null ignored
  * @param declaredType the declared Java type of the field, not null
  */
 protected static <T> void addToMessage(
     final FudgeSerializer serializer,
     final MutableFudgeMsg msg,
     final String fieldName,
     final T value,
     final Class<T> declaredType) {
   if (value != null) {
     MutableFudgeMsg subMsg = serializer.newMessage();
     FudgeSerializer.addClassHeader(subMsg, value.getClass(), declaredType);
     FudgeMsg builtMsg = serializer.objectToFudgeMsg(value);
     for (FudgeField field : builtMsg) {
       subMsg.add(field);
     }
     msg.add(fieldName, null, subMsg);
   }
 }
 private void testFudgeMessage(final ManageableTrade obj) {
   final FudgeSerializer serializer = new FudgeSerializer(s_fudgeContext);
   FudgeMsg msg = serializer.objectToFudgeMsg(obj);
   s_logger.debug("ManageableTrade {}", obj);
   s_logger.debug("Encoded to {}", msg);
   final byte[] bytes = s_fudgeContext.toByteArray(msg);
   msg = s_fudgeContext.deserialize(bytes).getMessage();
   s_logger.debug("Serialised to {}", msg);
   final ManageableTrade decoded = s_fudgeContext.fromFudgeMsg(ManageableTrade.class, msg);
   s_logger.debug("Decoded to {}", decoded);
   if (!obj.equals(decoded)) {
     s_logger.warn("Expected {}", obj);
     s_logger.warn("Received {}", decoded);
     fail();
   }
 }
  public void fudgeEncoding() {
    List<HistoricalTimeSeriesRatingRule> rules = new ArrayList<HistoricalTimeSeriesRatingRule>();
    rules.add(HistoricalTimeSeriesRatingRule.of(DATA_SOURCE_NAME, "BLOOMBERG", 2));
    rules.add(HistoricalTimeSeriesRatingRule.of(DATA_SOURCE_NAME, "REUTERS", 1));
    rules.add(HistoricalTimeSeriesRatingRule.of(DATA_PROVIDER_NAME, "CMPL", 3));
    HistoricalTimeSeriesRating inputConfig = HistoricalTimeSeriesRating.of(rules);

    FudgeSerializer serializationContext = new FudgeSerializer(s_fudgeContext);
    MutableFudgeMsg inputMsg = serializationContext.objectToFudgeMsg(inputConfig);
    FudgeMsg outputMsg =
        s_fudgeContext.deserialize(s_fudgeContext.toByteArray(inputMsg)).getMessage();
    assertNotNull(outputMsg);
    assertEquals(3, outputMsg.getNumFields());

    FudgeDeserializer deserializationContext = new FudgeDeserializer(s_fudgeContext);
    HistoricalTimeSeriesRating outputConfig =
        deserializationContext.fudgeMsgToObject(HistoricalTimeSeriesRating.class, outputMsg);

    assertEquals(inputConfig, outputConfig);
  }