Skip to content

Commit 93a5c08

Browse files
committed
another serialization bug fixed
1 parent 9cd6aaf commit 93a5c08

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

Source/AssetRipper.Import/Structure/Assembly/Mono/MonoType.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ private static Field MakeSerializableField(string name, TypeSignature typeSignat
8585
fieldType = new MonoType(typeDefinition, typeCache);
8686
}
8787

88-
return new Field(fieldType, arrayDepth, name);
88+
return new Field(fieldType, arrayDepth, name, typeDefinition.IsStruct());
8989

9090
case CorLibTypeSignature corLibTypeSignature:
91-
return new Field(SerializablePrimitiveType.GetOrCreate(corLibTypeSignature.ToPrimitiveType()), arrayDepth, name);
91+
return new Field(SerializablePrimitiveType.GetOrCreate(corLibTypeSignature.ToPrimitiveType()), arrayDepth, name, corLibTypeSignature.IsStruct());
9292

9393
case SzArrayTypeSignature szArrayTypeSignature:
9494
return MakeSerializableField(name, szArrayTypeSignature.BaseType, arrayDepth + 1, typeCache);
@@ -108,7 +108,7 @@ private static Field MakeSerializableField(string name, GenericInstanceTypeSigna
108108
return MakeSerializableField(name, typeSignature.TypeArguments[0], arrayDepth + 1, typeCache);
109109
}
110110

111-
return new(new MonoType(typeSignature, typeCache), arrayDepth, name);
111+
return new(new MonoType(typeSignature, typeCache), arrayDepth, name, typeSignature.IsStruct());
112112
}
113113
}
114114
}

Source/AssetRipper.Import/Structure/Assembly/Serializable/SerializableField.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public void Read(ref EndianSpanReader reader, UnityVersion version, TransferInst
3434
return;
3535
}
3636

37+
if (version.IsLess(4, 5, 0) && etalon.IsStruct && !etalon.Type.IsEngineStruct())
38+
{
39+
return;
40+
}
41+
3742
switch (etalon.Type.Type)
3843
{
3944
case PrimitiveType.Bool:
@@ -405,6 +410,11 @@ public YamlNode ExportYaml(IExportContainer container, in SerializableType.Field
405410
return null;
406411
}
407412

413+
if (container.Version.IsLess(4, 5, 0) && etalon.IsStruct && !etalon.Type.IsEngineStruct())
414+
{
415+
return null;
416+
}
417+
408418
if (etalon.IsArray)
409419
{
410420
if (etalon.Type.Type == PrimitiveType.Complex)
@@ -528,6 +538,11 @@ internal void CopyValues(SerializableField source, UnityVersion version, int dep
528538
return;
529539
}
530540

541+
if (version.IsLess(4, 5, 0) && etalon.IsStruct && !etalon.Type.IsEngineStruct())
542+
{
543+
return;
544+
}
545+
531546
if (etalon.IsArray)
532547
{
533548
PValue = default;

Source/AssetRipper.Import/Structure/Assembly/Serializable/SerializableType.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ public abstract class SerializableType
99
{
1010
public readonly struct Field
1111
{
12-
public Field(SerializableType type, int arrayDepth, string name)
12+
public Field(SerializableType type, int arrayDepth, string name, bool isStruct = false)
1313
{
1414
Type = type;
1515
ArrayDepth = arrayDepth;
1616
Name = name;
17+
IsStruct = isStruct;
1718
}
1819

1920
public override string? ToString()
@@ -29,6 +30,7 @@ public Field(SerializableType type, int arrayDepth, string name)
2930
public SerializableType Type { get; }
3031
public int ArrayDepth { get; }
3132
public bool IsArray => ArrayDepth > 0;
33+
public bool IsStruct { get; }
3234
public string Name { get; }
3335
}
3436

0 commit comments

Comments
 (0)