Serialization framework for Unreal Engine that just works!
Unreal Engine features a powerful Property System which implements C++ runtime reflection. DataConfig is a serialization framework build on top of it. Notably features:
- Out of the box JSON/MsgPack read write.
- Full support for UPROPERTY()/UCLASS()/USTRUCT()/UENUM().
- Pull/Push styled API for verbatim data access and lossless type infomation.
- Designed as a collection of tools that can be easily extended to support other formats.
Documentation
See DataConfig Book for details.
Example
Given a struct annotated and processed with Unreal's Property System:
UENUM() enum class EDcTestExampleEnum { Foo, Bar, Baz }; USTRUCT() struct FDcTestExampleStruct { GENERATED_BODY() UPROPERTY() FString StrField; UPROPERTY() EDcTestExampleEnum EnumField; UPROPERTY() TArray<FColor> Colors; };
DataConfig can deserialize an instance from JSON with the snippet below:
FString Str = TEXT(R"( { "StrField" : "Lorem ipsum dolor sit amet", "EnumField" : "Bar", "Colors" : [ "#FF0000FF", "#00FF00FF", "#0000FFFF" ] } )"); FDcTestExampleStruct Dest; // create and setup a deserializer FDcDeserializer Deserializer; DcSetupJsonDeserializeHandlers(Deserializer); Deserializer.AddPredicatedHandler( FDcDeserializePredicate::CreateStatic(DcExtra::PredicateIsColorStruct), FDcDeserializeDelegate::CreateStatic(DcExtra::HandlerColorDeserialize) ); // prepare deserialize context FDcPropertyDatum Datum(&Dest); FDcJsonReader Reader(Str); FDcPropertyWriter Writer(Datum); FDcDeserializeContext Ctx; Ctx.Reader = &Reader; Ctx.Writer = &Writer; Ctx.Deserializer = &Deserializer; DC_TRY(Ctx.Prepare()); // kick off deserialization DC_TRY(Deserializer.Deserialize(Ctx)); // validate results check(Dest.StrField == TEXT("Lorem ipsum dolor sit amet")); check(Dest.EnumField == EDcTestExampleEnum::Bar); check(Dest.Colors[0] == FColor::Red); check(Dest.Colors[1] == FColor::Green); check(Dest.Colors[2] == FColor::Blue);
Note that enum is deserialized by its name and FColor is deserialized from a html color string like #RRGGBBAA.
Say if we accidentally mistyped the EnumField value:
{
"StrField" : "Lorem ipsum dolor sit amet",
"EnumField" : "Far",DataConfig would fail gracefully with diagnostics:
# DataConfig Error: Enum name not found in enum type: EDcTestExampleEnum, Actual: 'Far'
- [JsonReader] --> <in-memory>4:25
2 | {
3 | "StrField" : "Lorem ipsum dolor sit amet",
4 | "EnumField" : "Far",
| ^
5 | "Colors" : [
6 | "#FF0000FF", "#00FF00FF", "#0000FFFF"
- [PropertyWriter] Writing property: (FDcTestExampleStruct)$root.(EEDcTestExampleEnum)EnumField
License
DataConfig is released under MIT License.
It would be trememdously helpful if you credit us in your projects. See the license page for details.