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 USTRUCT() struct FDcExtraTestStructWithColor1 { GENERATED_BODY() 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; DC_TRY(Ctx.Reader->ReadString(&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; DcSetupJsonDeserializeHandlers(Deserializer); Deserializer.AddStructHandler( TBaseStructure<FColor>::Get(), FDcDeserializeDelegate::CreateStatic(DcExtra::HandlerColorDeserialize) );

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.