Лучше ли кэшировать сериализованную строку Json или фактическую ссылку на объект в MemoryCache в .Net? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть совокупный репозиторий кэша моментальных снимков:

using Eventing.Core.Domain;
using Eventing.Core.Serialization;
using Microsoft.Extensions.Caching.Memory;
using System;

namespace Eventing.Core.Persistence
{
    public class InMemorySnapshotClient : ISnapshotClient
    {
        private readonly MemoryCache cache;
        private readonly TimeSpan timeToLive;
        private readonly IJsonSerializer serializer;

        public InMemorySnapshotClient(IJsonSerializer serializer)
            : this(TimeSpan.FromMinutes(30), serializer)
        { }

        public InMemorySnapshotClient(TimeSpan timeToLive, IJsonSerializer serializer)
        {
            Ensure.NotNull(serializer, nameof(serializer));

            this.cache = new MemoryCache(new MemoryCacheOptions());

            this.timeToLive = timeToLive;
            this.serializer = serializer;
        }

        public void Cache(IEventSourced state)
        {
            // make a copy of the state values to avoid concurrency problems with reusing references.
            var serialized = this.serializer.Serialize(state);
            this.cache.Set(
                key: state.StreamName,
                value: serialized,
                absoluteExpiration: DateTimeOffset.UtcNow.Add(this.timeToLive));
        }

        public bool TryGet(string streamName, out IEventSourced state)
        {
            var serialized = this.cache.Get(streamName);
            if (serialized == null)
            {
                state = null;
                return false;
            }

            state = this.serializer.Deserialize<IEventSourced>((string)serialized);
            return true;
        }
    }
}

Пожалуйста, потерпите меня, и спасибо, что нашли время, чтобы прочитать код.Как вы можете видеть, я сериализовал / десериализовал объект, чтобы избежать проблем параллелизма, с JSON.net.Но .. мои вопросы таковы:

  1. Будет ли гораздо эффективнее фактически клонировать объект в другой экземпляр и кэшировать его как реальный объект?
  2. Есть ли преимущество в сохранении кэширования строкового представления объекта?Потому что на самом деле гораздо проще просто сериализовать его, чем реализовывать ICloneable во всех классах DTO / POCO.
...