my approach
bool FMyFragmentPair::NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess)
{
if (!Key.NetSerialize(Ar, Map, bOutSuccess) || !bOutSuccess)
return false;
if (!Value.NetSerialize(Ar, Map, bOutSuccess) || !bOutSuccess)
return false;
return true;
}
bool FMyFragments::NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess)
{
bOutSuccess = false;
if (Ar.IsSaving())
{
TArray<FMyFragmentPair> pairs;
for (const TPair<FGameplayTag, FInstancedStruct>& fragment : Fragments)
{
pairs.Emplace(fragment.Key, fragment.Value);
}
Ar << pairs;
bOutSuccess = !Ar.IsError();
}
else if (Ar.IsLoading())
{
TArray<FMyFragmentPair> pairs;
Ar << pairs;
Fragments.Empty();
Fragments.Reserve(pairs.Num());
for (FMyFragmentPair& pair : pairs)
{
Fragments.Emplace(MoveTemp(pair.Key), MoveTemp(pair.Value));
}
bOutSuccess = !Ar.IsError();
}
return bOutSuccess;
}