DA因嵌套TArray会序列化所有数据导致文件大小很大

其中每个FAA数据里大部分参数都是默认值,只有少部分参数是会配置变化的。本来struct是不会序列化默认值的,但是TArray序列化时因为默认为空,所以序列化这些TArray里的FAA数据时,Defaults都是空指针,导致所有FAA数据都全量序列化了。

[Image Removed]

我想改成在这种情况下,传一个​默认初始化的FAA进去,使序列化过程中能根据这个默认值、只序列化改动的内容。请问一下有哪些风险,或者是否有现成的方案可以解决这个问题呢?

[Attachment Removed]

重现步骤
我们的DA是一个复杂的嵌套TArray结构,大致如下(实际有很多层TArray嵌套):

class UxxDA
{
        UPROPERTY(EditAnywhere)
        TArray<FAA> AA;
}​

struct FAA
{
        UPROPERTY(EditAnywhere)
        int32 Value = 0;

...

        UPROPERTY(EditAnywhere)
        TArray<FB1> B1;

        UPROPERTY(EditAnywhere)
        TArray<FB2> B2;

        UPROPERTY(EditAnywhere)
        TArray<FB3> B3;

...
}

这种情况下,所有FAA数据都全量序列化了。

[Attachment Removed]

您好,我想到两种方法可以参考一下

一种方法是将FAA作为UObject的派生类,并设置好默认值。在序列化时会根据CDO序列化

还有一种需要修改UxxDA的定义,让他以稀疏表达的方式记录变化项,而不是整个FAA结构体

前者如果UObject数量太多会影响GC、创建对象的开销等,而且UObject有额外的内容需要序列化

后者需要写一些逻辑去索引

[Attachment Removed]

感谢您的回答。

这两种的话我们可能会倾向于选后者。

另外我想再确认一下,如我上方截图处,在这种情况下传一个默认的FAA进去,使序列化过程中能根据这个默认值、只序列化改动的内容,这个方案是否可行呢?

[Attachment Removed]

是指把Defaults指针传进去吗,我看代码应该没什么问题。。但是这个Defaults值只有对象是UObject才有效吧?

[Attachment Removed]

对UStruct生效,这里会拿Defaults判断

[Image Removed]

[Attachment Removed]

嗯嗯,可以序列化UStruct,​我感觉在FArrayProperty这里也应该加上才是。

节后我问下总部的开发看看是什么原因没有保留

[Attachment Removed]

好的,非常感谢

[Attachment Removed]

您好,我看问题已经被关闭了。请问是否有问到全量序列化的原因呢?

[Attachment Removed]

您好,总部同事反馈:

数组元素没有唯一标识符。如果默认值(模板/原型)发生变化,我们无法在将差异应用于默认值之前进行元素的添加、删除或重新排序。我们没有保留这些类型变更的任何记录。我们最终会将差异应用于错误的元素,从而产生不正确的数据。

[Attachment Removed]

好的,感谢您的回答

[Attachment Removed]