Verified on UE 5.8.1 (editor, Game and Shipping targets) and UE 5.6.1 (editor), Linux, with the new automation suite passing on both. The source keeps its compatibility branches for older engines; those are not re-verified here.
- Pushkin Studio is the copyright holder of the project. Source headers and
LICENSEnow name Pushkin Studio instead of MY.GAMES; the license itself (MIT) is unchanged.
UUserDefinedStructcomes fromStructUtils/UserDefinedStruct.hon 5.5 and later.TArrayshrink arguments useEAllowShrinkingon 5.4 and later (PSDATA_SHRINK,PSDATA_NO_SHRINK); 5.8 removed thebooloverloads.- JSON keys:
FJsonObjectstores keys asUE::FSharedStringon 5.8; the JSON, struct and DataTable serializers no longer touchFJsonObject::Valuesby key. FPropertyconstruction andFField::Duplicatedrop object flags on 5.8, where fields no longer carry them.FCoreDelegates::GetOnPostEngineInit()on 5.8,UK2Node::IsNodePure()on 5.5 and later.DMETAno longer uses the deprecatedPREPROCESSOR_JOIN, which warned once perDMETAin every project on 5.8.- A
UE_LOGwith more arguments than format specifiers, which 5.8's format checker rejects at compile time, is fixed; anint64logged with%dnow uses%lld. PSDATA_ENGINE_AT_LEAST(Major, Minor)is the version guard for all of the above.
FPsDataFastJsonDeserializerkept a pointer into the string it was constructed from, so passing a temporary read freed memory. A newFString&&constructor takes such strings over; passing a named string still parses it in place.TPsDataPromise<T>did not compile once instantiated (wrong delegate array type,TOptional::Getwithout a default).DMETA(CustomType)removed the wrong tag from the parsed meta.PsDataTools::IsValidKey(const T*)rejected every non-empty string.- Fast JSON strings:
\uXXXX,\/,\band\ffrom other writers were kept as a backslash and letters, then doubled on the next write; control characters other than\n\r\twere written raw, which is invalid JSON. Both directions now follow RFC 8259, and keys are escaped like values. - A truncated or empty fast-JSON document read past the end of its token list or hit
checkNoEntry. It is now read up to where it stops;FPsDataFastJsonDeserializer::IsComplete()reports whether it was whole.
FPsDataJson, a property type for any JSON value whose shape the model does not own (server notifications, free-form attributes). Kept as compact text, written as real JSON in JSON documents and as structure in binary; stored in compact form, and text that is not JSON is refused (null and an error) so a stored value can always be written. Whole numbers that fit anint64travel asint64, others asdoubleat full precision. Brought over from the copy of PsData that DAWG ships, with its fast-JSON array handling fixed (an array inside a payload was read as an object there).FPsDataDeserializer::Translate(FPsDataSerializer*)copies a value with everything nested in it between any two formats without a model class, on top of a newNextValueType().doublein every serializer, deserializer and stream (WriteValue(double),ReadValue(double&),WriteDouble/ReadDouble). The new virtuals have default implementations, so serializers and streams written outside the plugin keep compiling.- The JSON schema marks
FPsDataJsonfields withIsDynamic. Tests/PsDataTests, a separate test plugin with 20 automation tests (PsData.*) over a miniature game model: reflection, properties, events, tree, collections, links, serialization, translation, escapes, truncated input,FPsDataJson, hashing, DataTable import, fixed-point and big-integer numbers. Nested inside the PsData folder it is never discovered, so game projects never compile or load its classes;Tools/test.shinstalls it next to PsData in the host project.Tools/test.sh: builds the plugin in a generated host project for any engine and runs the suite.- Documentation:
docs/(getting started, model reference, events, serialization, Blueprints, cookbook),docs/ai-guide.mdfor AI agents using the plugin,AGENTS.mdfor agents working on it,llms.txt.
Config/DefaultPsData.inistill declares its pre-2019 module redirects withMatchSubstring, which UE 5.6+ logs as deprecated at startup. Switching toMatchWildcardchanges how older engines read them, so it is left for a release that drops those engines.
See the git history.