Custom Serialization And Deserialization

DataConfig support custom serialization and deserialization logic by implementing FDcSerializeDelegate/FDcDeserializeDelegate.

In this example, we'd like to convert FColor into #RRGGBBAA and vice versa:

// DataConfigExtra/Public/DataConfig/Extra/Deserialize/DcSerDeColor.h
struct FDcExtraTestStructWithColor1

    UPROPERTY() FColor ColorField1;
    UPROPERTY() FColor ColorField2;

// DataConfigExtra/Private/DataConfig/Extra/Deserialize/DcSerDeColor.cpp
FString Str = TEXT(R"(
        "ColorField1" : "#0000FFFF",
        "ColorField2" : "#FF0000FF",

First you'll need to implement a FDcDeserializePredicate delegate to pick out FColor properties:

//  DataConfigExtra/Private/DataConfig/Extra/SerDe/DcSerDeColor.cpp
EDcDeserializePredicateResult PredicateIsColorStruct(FDcDeserializeContext& Ctx)
    return DcDeserializeUtils::PredicateIsUStruct<FColor>(Ctx);

Then we'll need to implement a FDcDeserializeDelegate to deserialize a FColor. Here we'll do it by writing through R/G/B/A fields by name with the FDcWriter API.

// DataConfigExtra/Private/DataConfig/Extra/Deserialize/DcSerDeColor.cpp
FDcResult HandlerColorDeserialize(FDcDeserializeContext& Ctx)
    FDcPropertyDatum Datum;
    DC_TRY(Ctx.Writer->WriteDataEntry(FStructProperty::StaticClass(), Datum));

    FString ColorStr;
    FColor Color = FColor::FromHex(ColorStr);

    FColor* ColorPtr = (FColor*)Datum.DataPtr;
    *ColorPtr = Color;

    return DcOk();

Note how we retrieve the hex string, then parse it with FColor::FromHex.

Upon deserializing we'll need to register these pair of delegates to the FDcDeserializer.

// DataConfigTests/Private/DcTestBlurb.cpp
FDcDeserializer Deserializer;

And then it's done! It would work recursively on FColor everywhere, like in UCLASS/USTRUCT members, in TArray/TSet and in TMap as key or values.

Note that DataConfig completely separate serialization and deserialization logic. To serialize FColor into #RRGGBBAA string one needs to implement a similar set of methods.