// Copyright Epic Games, Inc. All Rights Reserved. using System.IO; using EpicGames.Core; using Google.Protobuf; using Google.Protobuf.Reflection; using ProtoBuf; using StackExchange.Redis; namespace EpicGames.Redis.Converters { /// /// Converter for records to Redis values using protobuf serialization. /// /// The record type public class RedisProtobufConverter : IRedisConverter where T : IMessage, new() { readonly MessageDescriptor _descriptor; /// /// Constructor /// public RedisProtobufConverter() { _descriptor = new T().Descriptor; } /// public T FromRedisValue(RedisValue value) { return (T)_descriptor.Parser.ParseFrom((byte[])value!); } /// public RedisValue ToRedisValue(T value) { return value.ToByteArray(); } } /// /// Converter for records to Redis values using ProtoBuf-Net annotations. /// /// The record type public class RedisProtobufNetConverter : IRedisConverter { /// public RedisValue ToRedisValue(T value) { using (MemoryStream stream = new MemoryStream()) { Serializer.Serialize(stream, value); return stream.ToArray(); } } /// public T FromRedisValue(RedisValue value) { using (ReadOnlyMemoryStream stream = new ReadOnlyMemoryStream(value)) { T result = Serializer.Deserialize(stream); return result; } } } }