其中每个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]
tuo.chen
(tuo.chen)
3
您好,我想到两种方法可以参考一下
一种方法是将FAA作为UObject的派生类,并设置好默认值。在序列化时会根据CDO序列化
还有一种需要修改UxxDA的定义,让他以稀疏表达的方式记录变化项,而不是整个FAA结构体
前者如果UObject数量太多会影响GC、创建对象的开销等,而且UObject有额外的内容需要序列化
后者需要写一些逻辑去索引
[Attachment Removed]
感谢您的回答。
这两种的话我们可能会倾向于选后者。
另外我想再确认一下,如我上方截图处,在这种情况下传一个默认的FAA进去,使序列化过程中能根据这个默认值、只序列化改动的内容,这个方案是否可行呢?
[Attachment Removed]
tuo.chen
(tuo.chen)
5
是指把Defaults指针传进去吗,我看代码应该没什么问题。。但是这个Defaults值只有对象是UObject才有效吧?
[Attachment Removed]
对UStruct生效,这里会拿Defaults判断
[Image Removed]
[Attachment Removed]
tuo.chen
(tuo.chen)
7
嗯嗯,可以序列化UStruct,我感觉在FArrayProperty这里也应该加上才是。
节后我问下总部的开发看看是什么原因没有保留
[Attachment Removed]
您好,我看问题已经被关闭了。请问是否有问到全量序列化的原因呢?
[Attachment Removed]
tuo.chen
(tuo.chen)
10
您好,总部同事反馈:
数组元素没有唯一标识符。如果默认值(模板/原型)发生变化,我们无法在将差异应用于默认值之前进行元素的添加、删除或重新排序。我们没有保留这些类型变更的任何记录。我们最终会将差异应用于错误的元素,从而产生不正确的数据。
[Attachment Removed]