Skip to content

Commit c328af7

Browse files
committed
Fix SerializerGenerator does not generate types for members of array element in recursive mode. Issue #119
1 parent d8efc9b commit c328af7

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

src/MsgPack/Serialization/SerializerGenerator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,11 @@ private static IEnumerable<Type> ExtractElementTypes( SerializationContext conte
497497
var elementType = type.GetElementType();
498498
if ( !SerializationTarget.BuiltInSerializerExists( configuration, elementType, elementType.GetCollectionTraits() ) )
499499
{
500+
foreach ( var descendant in ExtractElementTypes( context, configuration, elementType ) )
501+
{
502+
yield return descendant;
503+
}
504+
500505
yield return elementType;
501506
}
502507

test/MsgPack.UnitTest/Serialization/SerializerGeneratorTest.cs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,77 @@ public void TestGenerateSerializerSourceCodes_ElementTypesNested_Generated()
10451045

10461046
#endregion -- Issue106 --
10471047

1048+
#region -- Issue 120 --
1049+
1050+
[Test]
1051+
public void TestGenerateSerializerSourceCodes_MemberTypesOfElementTypes_Generated()
1052+
{
1053+
var configuration = new SerializerCodeGenerationConfiguration { IsRecursive = true, PreferReflectionBasedSerializer = false };
1054+
var resultCS =
1055+
SerializerGenerator.GenerateSerializerSourceCodes(
1056+
configuration,
1057+
typeof( List<RootGeneratorTestObject> ),
1058+
typeof( AnotherRootGeneratorTestObject[] )
1059+
).ToArray();
1060+
try
1061+
{
1062+
// Assert is not polluted.
1063+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( RootGeneratorTestObject ) ), Is.False );
1064+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( AnotherRootGeneratorTestObject ) ), Is.False );
1065+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( GeneratorTestObject ) ), Is.False );
1066+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( AnotherGeneratorTestObject ) ), Is.False );
1067+
1068+
Assert.That( resultCS.Length, Is.EqualTo( 4 ) );
1069+
Assert.That( resultCS.Any( r => r.TargetType == typeof( RootGeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1070+
Assert.That( resultCS.Any( r => r.TargetType == typeof( AnotherGeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1071+
Assert.That( resultCS.Any( r => r.TargetType == typeof( GeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1072+
Assert.That( resultCS.Any( r => r.TargetType == typeof( AnotherGeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1073+
}
1074+
finally
1075+
{
1076+
foreach ( var result in resultCS )
1077+
{
1078+
File.Delete( result.FilePath );
1079+
}
1080+
}
1081+
}
1082+
1083+
[Test]
1084+
public void TestGenerateSerializerSourceCodes_MemberTypesOfElementTypesNested_Generated()
1085+
{
1086+
var configuration = new SerializerCodeGenerationConfiguration { IsRecursive = true, PreferReflectionBasedSerializer = false };
1087+
var resultCS =
1088+
SerializerGenerator.GenerateSerializerSourceCodes(
1089+
configuration,
1090+
typeof( HoldsRootElementTypeObject )
1091+
).ToArray();
1092+
try
1093+
{
1094+
// Assert is not polluted.
1095+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( HoldsRootElementTypeObject ) ), Is.False );
1096+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( RootGeneratorTestObject ) ), Is.False );
1097+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( AnotherRootGeneratorTestObject ) ), Is.False );
1098+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( GeneratorTestObject ) ), Is.False );
1099+
Assert.That( SerializationContext.Default.ContainsSerializer( typeof( AnotherGeneratorTestObject ) ), Is.False );
1100+
1101+
Assert.That( resultCS.Length, Is.EqualTo( 5 ) );
1102+
Assert.That( resultCS.Any( r => r.TargetType == typeof( HoldsRootElementTypeObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1103+
Assert.That( resultCS.Any( r => r.TargetType == typeof( RootGeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1104+
Assert.That( resultCS.Any( r => r.TargetType == typeof( AnotherRootGeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1105+
Assert.That( resultCS.Any( r => r.TargetType == typeof( GeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1106+
Assert.That( resultCS.Any( r => r.TargetType == typeof( AnotherGeneratorTestObject ) ), String.Join( ", ", resultCS.Select( r => r.TargetType.FullName ).ToArray() ) );
1107+
}
1108+
finally
1109+
{
1110+
foreach ( var result in resultCS )
1111+
{
1112+
File.Delete( result.FilePath );
1113+
}
1114+
}
1115+
}
1116+
1117+
#endregion -- Issue 120 --
1118+
10481119
private static void TestOnWorkerAppDomain( string geneartedAssemblyFilePath, PackerCompatibilityOptions packerCompatibilityOptions, byte[] bytesValue, byte[] expectedPackedValue, TestType testType )
10491120
{
10501121
var appDomainSetUp = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase };
@@ -1224,12 +1295,24 @@ public sealed class AnotherGeneratorTestObject
12241295
public byte[] Val { get; set; }
12251296
}
12261297

1298+
public sealed class AnotherRootGeneratorTestObject
1299+
{
1300+
public string Val { get; set; }
1301+
public AnotherGeneratorTestObject Child { get; set; }
1302+
}
1303+
12271304
public sealed class HoldsElementTypeObject
12281305
{
12291306
public List<GeneratorTestObject> List { get; set; }
12301307
public AnotherGeneratorTestObject[] Array { get; set; }
12311308
}
12321309

1310+
public sealed class HoldsRootElementTypeObject
1311+
{
1312+
public List<RootGeneratorTestObject> List { get; set; }
1313+
public AnotherRootGeneratorTestObject[] Array { get; set; }
1314+
}
1315+
12331316
[Serializable]
12341317
public enum TestEnumType
12351318
{

0 commit comments

Comments
 (0)