From 0bde769e116d578e0499770f81a038446f8a61ff Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 27 Oct 2020 14:48:54 +0800 Subject: [PATCH] Revert to use Newtonsoft for IAuditSerializer. Add JsonNetAuditSerializer_Test. --- .../Volo.Abp.Auditing.csproj | 4 ++ .../Abp/Auditing/AuditingContractResolver.cs | 43 ++++++++++++ .../AuditingRuntimeIgnoreConverter.cs | 45 ------------- .../Abp/Auditing/JsonNetAuditSerializer.cs | 27 ++++++-- .../Auditing/JsonNetAuditSerializer_Test.cs | 67 +++++++++++++++++++ 5 files changed, 135 insertions(+), 51 deletions(-) create mode 100644 framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs delete mode 100644 framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingRuntimeIgnoreConverter.cs create mode 100644 framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs diff --git a/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj b/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj index 4ac2420c8f..b3548a949b 100644 --- a/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj +++ b/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj @@ -22,5 +22,9 @@ + + + + diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs new file mode 100644 index 0000000000..a88de55aea --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace Volo.Abp.Auditing +{ + public class AuditingContractResolver : CamelCasePropertyNamesContractResolver + { + private readonly List _ignoredTypes; + + public AuditingContractResolver(List ignoredTypes) + { + _ignoredTypes = ignoredTypes; + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + var property = base.CreateProperty(member, memberSerialization); + + if (_ignoredTypes.Any(ignoredType => ignoredType.GetTypeInfo().IsAssignableFrom(property.PropertyType))) + { + property.ShouldSerialize = instance => false; + return property; + } + + if (member.DeclaringType != null && (member.DeclaringType.IsDefined(typeof(DisableAuditingAttribute)) || member.DeclaringType.IsDefined(typeof(JsonIgnoreAttribute)))) + { + property.ShouldSerialize = instance => false; + return property; + } + + if (member.IsDefined(typeof(DisableAuditingAttribute)) || member.IsDefined(typeof(JsonIgnoreAttribute))) + { + property.ShouldSerialize = instance => false; + } + + return property; + } + } +} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingRuntimeIgnoreConverter.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingRuntimeIgnoreConverter.cs deleted file mode 100644 index 240b2581ab..0000000000 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingRuntimeIgnoreConverter.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Volo.Abp.Auditing -{ - public class AuditingRuntimeIgnoreConverter : JsonConverter> - { - private readonly List _ignoredTypes; - - public AuditingRuntimeIgnoreConverter(List ignoredTypes) - { - _ignoredTypes = ignoredTypes; - } - - public override Dictionary Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - throw new JsonException(); - } - - public override void Write(Utf8JsonWriter writer, Dictionary value, JsonSerializerOptions options) - { - var newDictionary = new Dictionary(); - foreach (var item in value.Where(x => x.Value != null)) - { - if (item.GetType().IsDefined(typeof(DisableAuditingAttribute), true) || - item.GetType().IsDefined(typeof(JsonIgnoreAttribute), true)) - { - continue; - } - - if (_ignoredTypes.Any(x => x.IsInstanceOfType(item.Value))) - { - continue; - } - - newDictionary[item.Key] = item.Value; - } - - JsonSerializer.Serialize(writer, newDictionary); - } - } -} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs index d11886e5a7..b1ce95675b 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs @@ -1,5 +1,5 @@ -using System.Text.Json; using Microsoft.Extensions.Options; +using Newtonsoft.Json; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Auditing @@ -16,14 +16,29 @@ namespace Volo.Abp.Auditing public string Serialize(object obj) { - return JsonSerializer.Serialize(obj, GetJsonSerializerOptions()); + return JsonConvert.SerializeObject(obj, GetSharedJsonSerializerSettings()); } - private JsonSerializerOptions GetJsonSerializerOptions() + private static readonly object SyncObj = new object(); + private static JsonSerializerSettings _sharedJsonSerializerSettings; + + private JsonSerializerSettings GetSharedJsonSerializerSettings() { - var options = new JsonSerializerOptions(); - options.Converters.Add(new AuditingRuntimeIgnoreConverter(Options.IgnoredTypes)); - return options; + if (_sharedJsonSerializerSettings == null) + { + lock (SyncObj) + { + if (_sharedJsonSerializerSettings == null) + { + _sharedJsonSerializerSettings = new JsonSerializerSettings + { + ContractResolver = new AuditingContractResolver(Options.IgnoredTypes) + }; + } + } + } + + return _sharedJsonSerializerSettings; } } } diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs new file mode 100644 index 0000000000..da98f49bd6 --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Auditing +{ + public class JsonNetAuditSerializer_Test : AbpAuditingTestBase + { + private readonly JsonNetAuditSerializer _jsonNetAuditSerializer; + + public JsonNetAuditSerializer_Test() + { + _jsonNetAuditSerializer = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.IgnoredTypes.Add(typeof(DateTime)); + }); + + base.AfterAddApplication(services); + } + + [Fact] + public void Serialize_Test() + { + var arguments = new Dictionary + { + {"input", new InputDto {PersonData = "IdCard:123123"}}, + {"input2", new Input2Dto {UserName = "admin", Password = "1q2w3E*", Birthday = DateTime.Now}} + }; + + var str = _jsonNetAuditSerializer.Serialize(arguments); + + str.ShouldNotContain("IdCard"); + str.ShouldNotContain("1q2w3E*"); + str.ShouldNotContain("Birthday"); + + str.ShouldContain("UserName"); + str.ShouldContain("admin"); + } + + + [DisableAuditing] + class InputDto + { + public string PersonData { get; set; } + } + + class Input2Dto + { + public string UserName { get; set; } + + [DisableAuditing] + public string Password { get; set; } + + [Newtonsoft.Json.JsonIgnore] + public string PrivateEmail { get; set; } + + public DateTime Birthday { get; set; } + } + } +}