/* * Copyright (c) 2023 Vaughn Nugent * * Library: VNLib * Package: VNLib.Data.Caching * File: JsonCacheObjectSerializer.cs * * JsonCacheObjectSerializer.cs is part of VNLib.Data.Caching which is part of the larger * VNLib collection of libraries and utilities. * * VNLib.Data.Caching is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * VNLib.Data.Caching is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. */ using System; using System.Buffers; using System.Text.Json; using System.Text.Json.Serialization; using VNLib.Utils.Memory.Caching; namespace VNLib.Data.Caching { /// /// Implements a and a /// that uses JSON serialization, with writer pooling. Members of this class are thread-safe. /// public class JsonCacheObjectSerializer : ICacheObjectSerialzer, ICacheObjectDeserialzer { //Create threadlocal writer for attempted lock-free writer reuse private static readonly ObjectRental JsonWriterPool = ObjectRental.CreateThreadLocal(); private readonly JsonSerializerOptions? _options; /// /// Initializes a new /// /// JSON serialization/deserialization options public JsonCacheObjectSerializer(JsonSerializerOptions options) { _options = options; } /// /// Initializes a new using /// the default serialization rules /// public JsonCacheObjectSerializer() { //Configure default serialzation options _options = new() { DictionaryKeyPolicy = JsonNamingPolicy.CamelCase, NumberHandling = JsonNumberHandling.Strict, ReadCommentHandling = JsonCommentHandling.Disallow, WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, IgnoreReadOnlyFields = true, PropertyNameCaseInsensitive = true, IncludeFields = false, //Use small buffers DefaultBufferSize = 128 }; } /// public virtual object? Deserialze(Type type, ReadOnlySpan objectData) { return JsonSerializer.Deserialize(objectData, type, _options); } /// public virtual void Serialize(T obj, IBufferWriter finiteWriter) { //Rent new json writer ReusableJsonWriter writer = JsonWriterPool.Rent(); try { //Serialize the message writer.Serialize(finiteWriter, obj, _options); } finally { JsonWriterPool.Return(writer); } } } }