@Test
  public void testSerialize() {
    SFSSerializer sfsSerializer = new SFSSerializer();

    SubEntity subEntity = new SubEntity();
    subEntity.setLongField(10L);
    subEntity.setStringsList(Arrays.asList("testString"));

    Entity entity = new Entity();
    entity.setIntField(100);
    entity.setStringField("string");
    entity.setSubEntity(subEntity);
    entity.setSubEntities(Arrays.asList(new SubEntity(100L), new SubEntity(100L)));
    entity.setNotDeserializable("value1");
    entity.fieldWithoutGetter = "value";
    entity.setNotSerializable("value2");
    entity.setEnumField(Entity.Color.black);
    entity.setColors(Arrays.asList(Entity.Color.black, Entity.Color.white));
    entity.fieldCustomSerializable = 20L;
    entity.totallyIgnoredField = "value";

    ISFSObject sObj = sfsSerializer.serialize(entity);

    assertEquals(entity.getIntField(), sObj.getInt("intField"));
    assertEquals(entity.fieldWithoutGetter, sObj.getUtfString("fieldWithoutGetter"));
    assertEquals(entity.getEnumField().name(), sObj.getUtfString("enumField"));
    assertEquals(entity.getNameToBeChanged(), sObj.getUtfString("changedName"));
    assertEquals(entity.getNotDeserializable(), sObj.getUtfString("notDeserializable"));
    assertEquals(20, sObj.getInt("fieldCustomSerializable").intValue());
    Collection<String> colors = sObj.getUtfStringArray("colors");
    assertTrue(colors.contains(entity.getColors().get(1).name()));
    assertNull(sObj.getUtfString("totallyIgnoredField"));
    assertNull(sObj.getUtfString("notSerializable"));
    assertNull(sObj.getUtfString("ignoredField"));
    assertEquals(entity.getStringField(), sObj.getUtfString("stringField"));
    assertNotNull(sObj.getSFSObject("subEntity"));
    assertEquals(subEntity.getLongField(), sObj.getSFSObject("subEntity").getLong("longField"));
    assertNotNull(sObj.getSFSArray("subEntities"));
    Iterator<SFSDataWrapper> iterator = sObj.getSFSArray("subEntities").iterator();
    assertEquals(100L, ((SFSObject) iterator.next().getObject()).getLong("longField").longValue());

    assertEquals(
        "testString",
        sObj.getSFSObject("subEntity").getUtfStringArray("stringsList").iterator().next());
  }
  @Test
  public void testSerializeCustom() {
    SFSSerializer sfsSerializer = new SFSSerializer();
    Entity entity = new Entity();
    Entity subEntity = new Entity();
    Entity subEntityCustom = new Entity();
    subEntity.setIntField(10);
    subEntityCustom.setIntField(99);
    entity.setWildcardList(Arrays.asList(subEntity));
    entity.setWildcardedListCustom(Arrays.asList(subEntityCustom));

    sfsSerializer.registerPostProcessor(
        new SerializePostProcessor() {
          @Override
          public <ST, DT extends TransportObject> void process(ST result, DT sourceObject) {
            if (sourceObject instanceof Entity)
              ((ISFSObject) result).putBool("postProcessed", true);
          }
        });
    sfsSerializer.registerPreProcessor(
        new SerializePreProcessor() {
          @Override
          public <DT> void process(DT sourceObject) {
            if (sourceObject instanceof Entity) ((Entity) sourceObject).setPreProcessed(true);
          }
        });

    ISFSObject sObj = sfsSerializer.serialize(entity);

    assertNotNull(sObj.getSFSArray("wildcardList"));
    assertTrue(sObj.getBool("postProcessed"));
    assertTrue(sObj.getBool("preProcessed"));
    Iterator<SFSDataWrapper> iterator = sObj.getSFSArray("wildcardList").iterator();
    assertEquals(
        subEntity.getIntField() * 2,
        ((SFSObject) iterator.next().getObject()).getInt("intField").intValue());

    Iterator<SFSDataWrapper> customIterator = sObj.getSFSArray("wildcardedListCustom").iterator();
    assertEquals(
        subEntityCustom.getIntField(),
        ((SFSObject) customIterator.next().getObject()).getInt("intField"));
  }