Skip to content

Commit e7936c5

Browse files
Merge pull request #821 from AArnott/fix820
Fix serialization of private fields in base classes
2 parents 793b67a + 6f1ac55 commit e7936c5

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/DynamicObjectResolver.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1621,7 +1621,7 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe
16211621
}
16221622
}
16231623

1624-
foreach (FieldInfo item in type.GetRuntimeFields())
1624+
foreach (FieldInfo item in GetAllFields(type))
16251625
{
16261626
if (item.GetCustomAttribute<IgnoreMemberAttribute>(true) != null)
16271627
{
@@ -1897,6 +1897,23 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe
18971897
};
18981898
}
18991899

1900+
private static IEnumerable<FieldInfo> GetAllFields(Type type)
1901+
{
1902+
if (type.BaseType is object)
1903+
{
1904+
foreach (var item in GetAllFields(type.BaseType))
1905+
{
1906+
yield return item;
1907+
}
1908+
}
1909+
1910+
// with declared only
1911+
foreach (var item in type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
1912+
{
1913+
yield return item;
1914+
}
1915+
}
1916+
19001917
private static bool TryGetNextConstructor(IEnumerator<ConstructorInfo> ctorEnumerator, ref ConstructorInfo ctor)
19011918
{
19021919
if (ctorEnumerator == null || ctor != null)

src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/DynamicObjectResolverTests.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#if !ENABLE_IL2CPP
55

66
using System;
7+
using System.Runtime.Serialization;
8+
using MessagePack.Resolvers;
79
using Xunit;
810
using Xunit.Abstractions;
911

@@ -36,6 +38,13 @@ public void SerializeTypeWithReadWriteFields()
3638
Assert3MemberClassSerializedContent(MessagePackSerializer.Serialize(new TestMessageWithReadWriteFields()));
3739
}
3840

41+
[Fact]
42+
public void PrivateMembersInBaseClass_StandardResolverAllowPrivate()
43+
{
44+
var options = StandardResolverAllowPrivate.Options;
45+
PrivateMembersInBaseClass_Helper(options);
46+
}
47+
3948
private static void Assert3MemberClassSerializedContent(ReadOnlyMemory<byte> msgpack)
4049
{
4150
var reader = new MessagePackReader(msgpack);
@@ -45,6 +54,17 @@ private static void Assert3MemberClassSerializedContent(ReadOnlyMemory<byte> msg
4554
Assert.Equal(3, reader.ReadInt32());
4655
}
4756

57+
private void PrivateMembersInBaseClass_Helper(MessagePackSerializerOptions options)
58+
{
59+
var obj = new DerivedClass { Name = "name", BaseClassFieldAccessor = 15, BaseClassProperty = 5 };
60+
var bin = MessagePackSerializer.Serialize(obj, options);
61+
this.logger.WriteLine(MessagePackSerializer.ConvertToJson(bin));
62+
var obj2 = MessagePackSerializer.Deserialize<DerivedClass>(bin, options);
63+
Assert.Equal(obj.BaseClassFieldAccessor, obj2.BaseClassFieldAccessor);
64+
Assert.Equal(obj.BaseClassProperty, obj2.BaseClassProperty);
65+
Assert.Equal(obj.Name, obj2.Name);
66+
}
67+
4868
[MessagePackObject]
4969
public class TestMessageWithReadOnlyField
5070
{
@@ -83,6 +103,35 @@ public class TestMessageWithReadOnlyProperty
83103
[Key(2)]
84104
public int Property3 { get; set; } = 3;
85105
}
106+
107+
[DataContract]
108+
public class BaseClass
109+
{
110+
[DataMember]
111+
private int baseClassField;
112+
113+
public int BaseClassFieldAccessor
114+
{
115+
get => this.baseClassField;
116+
set => this.baseClassField = value;
117+
}
118+
119+
private int baseClassPropertyBackingField;
120+
121+
[DataMember]
122+
public int BaseClassProperty
123+
{
124+
get => this.baseClassPropertyBackingField;
125+
set => this.baseClassPropertyBackingField = value;
126+
}
127+
}
128+
129+
[DataContract]
130+
public class DerivedClass : BaseClass
131+
{
132+
[DataMember]
133+
public string Name { get; set; }
134+
}
86135
}
87136
}
88137

0 commit comments

Comments
 (0)