diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs index 07e1648ab4..b78a5aa400 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.Domain.Entities public abstract class Entity : Entity, IEntity { /// - public virtual TKey Id { get; set; } + public virtual TKey Id { get; protected set; } protected Entity() { diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/Utf8JsonMemoryDbSerializer.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/Utf8JsonMemoryDbSerializer.cs index 9964e6219b..e68b4b6f37 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/Utf8JsonMemoryDbSerializer.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/Utf8JsonMemoryDbSerializer.cs @@ -1,5 +1,8 @@ using System; +using System.Reflection; using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; @@ -7,21 +10,43 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { public class Utf8JsonMemoryDbSerializer : IMemoryDbSerializer, ITransientDependency { - private readonly IJsonSerializer _jsonSerializer; + private static readonly JsonSerializerSettings MemoryDbSerializerSettings; - public Utf8JsonMemoryDbSerializer(IJsonSerializer jsonSerializer) + static Utf8JsonMemoryDbSerializer() { - _jsonSerializer = jsonSerializer; + MemoryDbSerializerSettings = new JsonSerializerSettings + { + ContractResolver = new ResolverWithPrivateSetters(), + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor + }; } byte[] IMemoryDbSerializer.Serialize(object obj) { - return Encoding.UTF8.GetBytes(_jsonSerializer.Serialize(obj)); + var jsonString = JsonConvert.SerializeObject(obj, MemoryDbSerializerSettings); + return Encoding.UTF8.GetBytes(jsonString); } public object Deserialize(byte[] value, Type type) { - return _jsonSerializer.Deserialize(type, Encoding.UTF8.GetString(value)); + var jsonString = Encoding.UTF8.GetString(value); + return JsonConvert.DeserializeObject(jsonString, type, MemoryDbSerializerSettings); + } + + public class ResolverWithPrivateSetters : DefaultContractResolver + { + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + var prop = base.CreateProperty(member, memberSerialization); + if (prop.Writable) + { + return prop; + } + + prop.Writable = member.As()?.GetSetMethod(true) != null; + + return prop; + } } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Entities/EntityHelper_Tests.cs b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Entities/EntityHelper_Tests.cs index 7207085ee6..2ad6a45b05 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Entities/EntityHelper_Tests.cs +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Entities/EntityHelper_Tests.cs @@ -40,7 +40,7 @@ namespace Volo.Abp.Domain.Entities private class MyEntityImplementsIEntity : IEntity { - public Guid Id { get; set; } + public Guid Id { get; protected set; } public object[] GetKeys() { @@ -51,7 +51,7 @@ namespace Volo.Abp.Domain.Entities private class MyEntityDisablesIdGeneration : Entity { [DisableIdGeneration] - public override Guid Id { get; set; } + public override Guid Id { get; protected set; } } } }