diff --git a/tests/SerializationModels.cs b/tests/SerializationModels.cs index 6a8dfad..780f95d 100644 --- a/tests/SerializationModels.cs +++ b/tests/SerializationModels.cs @@ -294,6 +294,27 @@ public struct StrictBlittableStruct public int Value { get; init; } } +[ZeroSerializer] +public class DuplicateInstanceContainer +{ + public SharedClassItem? Foo { get; set; } + public SharedClassItem? Bar { get; set; } + public SharedClassItem? Baz { get; set; } +} + +[ZeroSerializer] +public class SharedClassItem +{ + public int Value { get; set; } + public SharedClassNested? Nested { get; set; } +} + +[ZeroSerializer] +public class SharedClassNested +{ + public int NestedValue { get; set; } +} + [ZeroSerializer] public record SimpleCsharpRecord { diff --git a/tests/SerializationTests.cs b/tests/SerializationTests.cs index fc25670..f76c11b 100644 --- a/tests/SerializationTests.cs +++ b/tests/SerializationTests.cs @@ -1228,4 +1228,34 @@ public void BlittableRecordStructNestedPropertyRoundTrip() TestAssert.True(viewNulls.Values.IsEmpty, nameof(viewNulls.Values.IsEmpty)); TestAssert.Equal(writtenBytesNulls, viewNulls.GetByteLength(), "Nulls GetByteLength"); } + + [Fact] + public void SharedReferenceInstancesRoundTrip() + { + var sharedNested = new SharedClassNested { NestedValue = 42 }; + var sharedItem = new SharedClassItem { Value = 100, Nested = sharedNested }; + var distinctItemWithSharedNested = new SharedClassItem { Value = 200, Nested = sharedNested }; + + // Foo and Bar share SharedClassItem instance; Baz has a distinct SharedClassItem instance but shares the same SharedClassNested instance + var container = new DuplicateInstanceContainer + { + Foo = sharedItem, + Bar = sharedItem, + Baz = distinctItemWithSharedNested, + }; + + var buffer = new byte[256]; + int writtenBytes = container.Serialize(buffer); + var view = new DuplicateInstanceContainerView(buffer.AsMemory(0, writtenBytes)); + + TestAssert.Equal(100, view.Foo.Value, nameof(view.Foo.Value)); + TestAssert.Equal(100, view.Bar.Value, nameof(view.Bar.Value)); + TestAssert.Equal(200, view.Baz.Value, nameof(view.Baz.Value)); + + TestAssert.Equal(42, view.Foo.Nested.NestedValue, nameof(view.Foo.Nested.NestedValue)); + TestAssert.Equal(42, view.Bar.Nested.NestedValue, nameof(view.Bar.Nested.NestedValue)); + TestAssert.Equal(42, view.Baz.Nested.NestedValue, nameof(view.Baz.Nested.NestedValue)); + + TestAssert.Equal(writtenBytes, view.GetByteLength(), "SharedReferenceInstances GetByteLength"); + } }