Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions NClient.sln
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Api.Rest"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Api.Rest.Tests", "tests\NClient.Providers\NClient.Providers.Api.Rest.Tests\NClient.Providers.Api.Rest.Tests.csproj", "{27521108-9C67-44AE-885C-3BE343421955}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Serialization.Protobuf.ProtobufNet", "src\NClient.Providers\NClient.Providers.Serialization.Protobuf.ProtobufNet\NClient.Providers.Serialization.Protobuf.ProtobufNet.csproj", "{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests", "tests\NClient.Providers\NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests\NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.csproj", "{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -279,6 +283,18 @@ Global
{27521108-9C67-44AE-885C-3BE343421955}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27521108-9C67-44AE-885C-3BE343421955}.Release|Any CPU.Build.0 = Release|Any CPU
{27521108-9C67-44AE-885C-3BE343421955}.TestRelease|Any CPU.ActiveCfg = Release|Any CPU
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Release|Any CPU.Build.0 = Release|Any CPU
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.TestRelease|Any CPU.ActiveCfg = Debug|Any CPU
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.TestRelease|Any CPU.Build.0 = Debug|Any CPU
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Release|Any CPU.Build.0 = Release|Any CPU
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.TestRelease|Any CPU.ActiveCfg = Debug|Any CPU
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.TestRelease|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -318,6 +334,8 @@ Global
{FA3D9C32-CC55-4D39-8F49-5FC3040EBD78} = {B1BCB5AE-6A5E-49F7-A00A-6B2931DF628C}
{0BB4D666-9C18-4F71-A0A3-88DCC275139D} = {DCB997FD-29F4-48D9-8348-093761DA42E7}
{27521108-9C67-44AE-885C-3BE343421955} = {B1BCB5AE-6A5E-49F7-A00A-6B2931DF628C}
{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772} = {DCB997FD-29F4-48D9-8348-093761DA42E7}
{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3} = {B1BCB5AE-6A5E-49F7-A00A-6B2931DF628C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {244A4C58-8FA7-496C-ABCF-72F333149A20}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using NClient.Common.Helpers;
using NClient.Providers.Serialization;
using NClient.Providers.Serialization.Protobuf.ProtobufNet;

// ReSharper disable once CheckNamespace
namespace NClient
{
public static class ProtobufSerializationExtensions
{
/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="optionalBuilder"></param>
/// <typeparam name="TClient"></typeparam>
/// <typeparam name="TRequest"></typeparam>
/// <typeparam name="TResponse"></typeparam>
/// <returns></returns>
public static INClientOptionalBuilder<TClient, TRequest, TResponse> WithProtobufNetSerialization<TClient, TRequest, TResponse>(
this INClientOptionalBuilder<TClient, TRequest, TResponse> optionalBuilder)
where TClient : class
{
Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));

return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider());
}

/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="optionalBuilder"></param>
/// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
/// <typeparam name="TClient"></typeparam>
/// <typeparam name="TRequest"></typeparam>
/// <typeparam name="TResponse"></typeparam>
/// <returns></returns>
public static INClientOptionalBuilder<TClient, TRequest, TResponse> WithProtobufNetSerialization<TClient, TRequest, TResponse>(
this INClientOptionalBuilder<TClient, TRequest, TResponse> optionalBuilder,
ProtobufSerializerSettings protobufSerializerSettings)
where TClient : class
{
Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));
Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));

return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider(protobufSerializerSettings));
}

/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="optionalBuilder"></param>
/// <typeparam name="TRequest"></typeparam>
/// <typeparam name="TResponse"></typeparam>
/// <returns></returns>
public static INClientFactoryOptionalBuilder<TRequest, TResponse> WithProtobufNetSerialization<TRequest, TResponse>(
this INClientFactoryOptionalBuilder<TRequest, TResponse> optionalBuilder)
{
Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));

return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider());
}

/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="optionalBuilder"></param>
/// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
/// <typeparam name="TRequest"></typeparam>
/// <typeparam name="TResponse"></typeparam>
/// <returns></returns>
public static INClientFactoryOptionalBuilder<TRequest, TResponse> WithProtobufNetSerialization<TRequest, TResponse>(
this INClientFactoryOptionalBuilder<TRequest, TResponse> optionalBuilder,
ProtobufSerializerSettings protobufSerializerSettings)
{
Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));
Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));

return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider(protobufSerializerSettings));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using NClient.Common.Helpers;
using NClient.Providers.Serialization;
using NClient.Providers.Serialization.Protobuf.ProtobufNet;

// ReSharper disable once CheckNamespace
namespace NClient
{
public static class UsingProtobufSerializationExtensions
{
/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="serializationBuilder"></param>
public static INClientOptionalBuilder<TClient, TRequest, TResponse> UsingProtobufNetSerialization<TClient, TRequest, TResponse>(
this INClientSerializationBuilder<TClient, TRequest, TResponse> serializationBuilder)
where TClient : class
{
Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));

return serializationBuilder.UsingCustomSerializer(new ProtobufSerializerProvider());
}

/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="serializationBuilder"></param>
/// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
public static INClientOptionalBuilder<TClient, TRequest, TResponse> UsingProtobufNetSerialization<TClient, TRequest, TResponse>(
this INClientSerializationBuilder<TClient, TRequest, TResponse> serializationBuilder,
ProtobufSerializerSettings protobufSerializerSettings)
where TClient : class
{
Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));
Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));

return serializationBuilder
.UsingCustomSerializer(new ProtobufSerializerProvider(protobufSerializerSettings));
}

/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="serializationBuilder"></param>
public static INClientFactoryOptionalBuilder<TRequest, TResponse> UsingProtobufNetSerialization<TRequest, TResponse>(
this INClientFactorySerializationBuilder<TRequest, TResponse> serializationBuilder)
{
Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));

return serializationBuilder.UsingCustomSerializer(new ProtobufSerializerProvider());
}

/// <summary>
/// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
/// </summary>
/// <param name="serializationBuilder"></param>
/// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
public static INClientFactoryOptionalBuilder<TRequest, TResponse> UsingProtobufNetSerialization<TRequest, TResponse>(
this INClientFactorySerializationBuilder<TRequest, TResponse> serializationBuilder,
ProtobufSerializerSettings protobufSerializerSettings)
{
Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));
Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));

return serializationBuilder
.UsingCustomSerializer(new ProtobufSerializerProvider(protobufSerializerSettings));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<Project Sdk="Microsoft.NET.Sdk">


<PropertyGroup>
<PackageId>$(AssemblyName)</PackageId>
<VersionPrefix>$(VersionPrefix)</VersionPrefix>
<VersionSuffix>$(VersionSuffix)</VersionSuffix>
<PackageIcon>logo.png</PackageIcon>
<PackageProjectUrl>https://nclient.github.io</PackageProjectUrl>
<RepositoryUrl>https://github.com/nclient/nclient</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>NClient;NClient.Providers;NClient.Providers.Serialization;Protobuf;Google;protobuf-net</PackageTags>
<Description>The provider that allows you to use the Protobuf serializer.</Description>
<Authors>kingmidas74</Authors>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<IsPackable>true</IsPackable>
</PropertyGroup>

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
<LangVersion>9.0</LangVersion>
<Nullable>enable</Nullable>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
<Configurations>Debug;Release</Configurations>
<Platforms>AnyCPU</Platforms>
<OutputPath>$(SolutionDir)/bin/src/$(Configuration)/$(AssemblyName)</OutputPath>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\NClient\NClient.Abstractions\NClient.Abstractions.csproj" />
</ItemGroup>

<ItemGroup>
<None Include="..\..\..\logo.png" Pack="true" PackagePath="" />
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" />
</ItemGroup>

<ItemGroup>
<Compile Include="..\..\NClient\NClient.Common\Helpers\Ensure.cs">
<Link>Common\Ensure.cs</Link>
</Compile>
<Compile Include="..\..\NClient\NClient.Common\Helpers\Converters.cs">
<Link>Common\Converters.cs</Link>
</Compile>
</ItemGroup>

<ItemGroup>
<PackageReference Include="protobuf-net" Version="3.0.101" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System;
using System.IO;
using NClient.Common.Helpers;
using ProtoBuf;

namespace NClient.Providers.Serialization.Protobuf.ProtobufNet
{
public class ProtobufSerializer : ISerializer
{
private readonly ProtobufSerializerSettings _protobufSerializerSettings;

public string ContentType { get; } = String.Empty;

public ProtobufSerializer(ProtobufSerializerSettings protobufSerializerSettings)
{
Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
Ensure.IsNotNullOrEmpty(protobufSerializerSettings.ContentTypeHeader, nameof(protobufSerializerSettings.ContentTypeHeader));

_protobufSerializerSettings = protobufSerializerSettings;
ContentType = _protobufSerializerSettings.ContentTypeHeader;
}

public object? Deserialize(string source, Type returnType)
{
Ensure.IsNotNull(source, nameof(source));
Ensure.IsNotNull(returnType, nameof(returnType));

var bytes = Converters.GetBytes(source);

using var memoryStream = new MemoryStream(bytes);
return Serializer.Deserialize(returnType, memoryStream);
}

public string Serialize<T>(T? value)
{
Ensure.IsNotNull(value, nameof(value));

using var memoryStream = new MemoryStream();
Serializer.Serialize(memoryStream, value);

return Converters.GetString(memoryStream.ToArray());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Microsoft.Extensions.Logging;
using NClient.Common.Helpers;

namespace NClient.Providers.Serialization.Protobuf.ProtobufNet
{
public class ProtobufSerializerProvider : ISerializerProvider
{
private readonly ProtobufSerializerSettings _protobufSerializerSettings;

/// <summary>
/// Creates the Protobuf serializer provider.
/// </summary>
public ProtobufSerializerProvider()
{
_protobufSerializerSettings = new ProtobufSerializerSettings("application/proto");
}

/// <summary>
/// Creates the Newtonsoft.Json based serializer provider.
/// </summary>
/// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
public ProtobufSerializerProvider(ProtobufSerializerSettings protobufSerializerSettings)
{
Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));

_protobufSerializerSettings = protobufSerializerSettings;
}

public ISerializer Create(ILogger? logger)
{
return new ProtobufSerializer(_protobufSerializerSettings);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using NClient.Common.Helpers;

namespace NClient.Providers.Serialization.Protobuf.ProtobufNet
{
public record ProtobufSerializerSettings
{
public string ContentTypeHeader { get; } = string.Empty;

public ProtobufSerializerSettings(string contentTypeHeader)
{
Ensure.IsNotNullOrEmpty(contentTypeHeader, nameof(contentTypeHeader));

ContentTypeHeader = contentTypeHeader;
}
}
}
21 changes: 21 additions & 0 deletions src/NClient/NClient.Common/Helpers/Converters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;

namespace NClient.Common.Helpers
{
internal static class Converters
{
public static string GetString(byte[] source)
{
var chars = new char[source.Length];
Buffer.BlockCopy(source, 0, chars, 0, source.Length);
return new string(chars);
}

public static byte[] GetBytes(string source)
{
byte[] result = new byte[source.Length];
Buffer.BlockCopy(source.ToCharArray(), 0, result, 0, result.Length);
return result;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
<PackageReference Include="NClient.Providers.Serialization.Json.System" Version="*-*"/>
<PackageReference Include="NClient.Providers.Serialization.Json.Newtonsoft" Version="*-*"/>
<PackageReference Include="NClient.Providers.Serialization.Xml.System" Version="*-*"/>
<PackageReference Include="NClient.Providers.Serialization.Protobuf.ProtobufNet" Version="*-*"/>
<PackageReference Include="NClient.Extensions.DependencyInjection" Version="*-*"/>
</ItemGroup>

Expand Down
4 changes: 4 additions & 0 deletions tests/NClient.Packages/NClient.Packages.Tests/VersionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ public void NClient_Providers_Serialization_Json_System() =>
public void NClient_Providers_Serialization_Json_Newtonsoft() =>
PackagesVersionProvider.GetCurrent("NClient.Providers.Serialization.Json.Newtonsoft").Should().Be(PackagesVersionProvider.GetNew());

[Test]
public void NClient_Providers_Serialization_Protobuf_ProtobufNet() =>
PackagesVersionProvider.GetCurrent("NClient.Providers.Serialization.Protobuf.ProtobufNet").Should().Be(PackagesVersionProvider.GetNew());

[Test]
public void NClient_Providers_Serialization_Xml_System() =>
PackagesVersionProvider.GetCurrent("NClient.Providers.Serialization.Xml.System").Should().Be(PackagesVersionProvider.GetNew());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.Models
{
public readonly struct NotProto
{
public readonly int X;
public readonly int Y;

public NotProto(int x, int y)
{
X = x;
Y = y;
}
}
}
Loading