1struct FReplicatedData
2{
3int32 IntValue;
4float FloatValue;
5FString StringValue;
6TArray<int32> IntArray;
7TArray<FString> StringArray;
8FVector NestedVector;
9
10
11FReplicatedData()
12: IntValue(0), FloatValue(0.0f), NestedVector(FVector::ZeroVector) {}
13};
14
15
16
17
18
19bool SerializeReplicatedData(TArray<uint8>& Buffer, const FReplicatedData& Data)
20{
21
22
23Buffer.Reserve(1024);
24
25
26Buffer.Append((uint8*)&Data.IntValue, sizeof(Data.IntValue));
27
28
29Buffer.Append((uint8*)&Data.FloatValue, sizeof(Data.FloatValue));
30
31
32int32 StringLength = Data.StringValue.Len();
33Buffer.Append((uint8*)&StringLength, sizeof(StringLength));
34Buffer.Append((uint8*)Data.StringValue.GetCharArray().GetData(), StringLength * sizeof(TCHAR));
35
36
37int32 IntArraySize = Data.IntArray.Num();
38Buffer.Append((uint8*)&IntArraySize, sizeof(IntArraySize));
39for (int32 Value : Data.IntArray)
40{
41Buffer.Append((uint8*)&Value, sizeof(Value));
42}
43
44
45int32 StringArraySize = Data.StringArray.Num();
46Buffer.Append((uint8*)&StringArraySize, sizeof(StringArraySize));
47for (const FString& Str : Data.StringArray)
48{
49int32 CurrentStringLength = Str.Len();
50Buffer.Append((uint8*)&CurrentStringLength, sizeof(CurrentStringLength));
51Buffer.Append((uint8*)Str.GetCharArray().GetData(), CurrentStringLength * sizeof(TCHAR));
52}
53
54
55Buffer.Append((uint8*)&Data.NestedVector, sizeof(Data.NestedVector));
56
57
58
59return true;
60}
61
62
63
64
65
66
67bool DeserializeReplicatedData(const TArray<uint8>& Buffer, FReplicatedData& Data, int32& Offset)
68{
69if (Offset < 0 || Offset >= Buffer.Num())
70{
71return false;
72}
73
74
75if (Offset + sizeof(Data.IntValue) > Buffer.Num())
76{
77return false;
78}
79FMemory::Memcpy(&Data.IntValue, Buffer.GetData() + Offset, sizeof(Data.IntValue));
80Offset += sizeof(Data.IntValue);
81
82
83if (Offset + sizeof(Data.FloatValue) > Buffer.Num())
84{
85return false;
86}
87FMemory::Memcpy(&Data.FloatValue, Buffer.GetData() + Offset, sizeof(Data.FloatValue));
88Offset += sizeof(Data.FloatValue);
89
90
91int32 StringLength;
92if (Offset + sizeof(StringLength) > Buffer.Num())
93{
94return false;
95}
96FMemory::Memcpy(&StringLength, Buffer.GetData() + Offset, sizeof(StringLength));
97Offset += sizeof(StringLength);
98
99if (StringLength < 0 || Offset + StringLength * sizeof(TCHAR) > Buffer.Num())
100{
101return false;
102}
103Data.StringValue = FString(StringLength, (TCHAR*)Buffer.GetData() + Offset);
104Offset += StringLength * sizeof(TCHAR);
105
106
107int32 IntArraySize;
108if (Offset + sizeof(IntArraySize) > Buffer.Num())
109{
110return false;
111}
112FMemory::Memcpy(&IntArraySize, Buffer.GetData() + Offset, sizeof(IntArraySize));
113Offset += sizeof(IntArraySize);
114
115if (IntArraySize < 0 || Offset + IntArraySize * sizeof(int32) > Buffer.Num())
116{
117return false;
118}
119Data.IntArray.SetNum(IntArraySize);
120for (int32 i = 0; i < IntArraySize; ++i)
121{
122FMemory::Memcpy(&Data.IntArray[i], Buffer.GetData() + Offset, sizeof(int32));
123Offset += sizeof(int32);
124}
125
126
127int32 StringArraySize;
128if (Offset + sizeof(StringArraySize) > Buffer.Num())
129{
130return false;
131}
132FMemory::Memcpy(&StringArraySize, Buffer.GetData() + Offset, sizeof(StringArraySize));
133Offset += sizeof(StringArraySize);
134
135if (StringArraySize < 0)
136{
137return false;
138}
139Data.StringArray.Reserve(StringArraySize);
140for (int32 i = 0; i < StringArraySize; ++i)
141{
142int32 CurrentStringLength;
143if (Offset + sizeof(CurrentStringLength) > Buffer.Num())
144{
145return false;
146}
147FMemory::Memcpy(&CurrentStringLength, Buffer.GetData() + Offset, sizeof(CurrentStringLength));
148Offset += sizeof(CurrentStringLength);
149
150if (CurrentStringLength < 0 || Offset + CurrentStringLength * sizeof(TCHAR) > Buffer.Num())
151{
152return false;
153}
154Data.StringArray.Add(FString(CurrentStringLength, (TCHAR*)Buffer.GetData() + Offset));
155Offset += CurrentStringLength * sizeof(TCHAR);
156}
157
158
159if (Offset + sizeof(Data.NestedVector) > Buffer.Num())
160{
161return false;
162}
163FMemory::Memcpy(&Data.NestedVector, Buffer.GetData() + Offset, sizeof(Data.NestedVector));
164Offset += sizeof(Data.NestedVector);
165
166return true;
167}