diff --git a/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/DynamicObjectResolver.cs index 49e1c821f..c847a3038 100644 --- a/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -1773,7 +1773,7 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe { FieldInfo = field, IsReadable = allowPrivate || field.IsPublic, - IsWritable = allowPrivate || (field.IsPublic && !field.IsInitOnly), + IsWritable = (allowPrivate || field.IsPublic) && !field.IsInitOnly, StringKey = firstMemberByName ? item.Name : $"{item.DeclaringType.FullName}.{item.Name}", }; } @@ -1956,7 +1956,7 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe { FieldInfo = item, IsReadable = allowPrivate || item.IsPublic, - IsWritable = allowPrivate || (item.IsPublic && !item.IsInitOnly), + IsWritable = (allowPrivate || item.IsPublic) && !item.IsInitOnly, }; if (!member.IsReadable && !member.IsWritable) { diff --git a/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/AllowPrivateTest.cs b/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/AllowPrivateTest.cs index 505db369e..f27b794e1 100644 --- a/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/AllowPrivateTest.cs +++ b/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/AllowPrivateTest.cs @@ -157,6 +157,28 @@ internal class InternalClass internal InternalEnum EnumProperty { get; set; } } + [MessagePackObject] + public class PrivateReadonlyField + { + public static PrivateReadonlyField WithNullValue { get; } = new PrivateReadonlyField(); + + [Key(0)] + private readonly string field; + + [SerializationConstructor] + public PrivateReadonlyField(string field) + { + this.field = field ?? "not null"; + } + + private PrivateReadonlyField() + { + } + + [IgnoreMember] + public string Field => field; + } + #if !ENABLE_IL2CPP [MessagePackObject] @@ -329,6 +351,15 @@ public void InternalClassWithInternalEnum() Assert.Equal(expected.EnumProperty, actual.EnumProperty); } + [Fact] + public void PrivateReadonlyFieldSetInConstructor() + { + PrivateReadonlyField initial = PrivateReadonlyField.WithNullValue; + var bin = MessagePackSerializer.Serialize(initial, StandardResolverAllowPrivate.Options); + var deserialized = MessagePackSerializer.Deserialize(bin, StandardResolverAllowPrivate.Options); + Assert.Equal("not null", deserialized.Field); + } + #if !ENABLE_IL2CPP [Fact]