From 0df8591f2c614e7a6bdfbe4ef01144562b9901da Mon Sep 17 00:00:00 2001 From: Dave Date: Wed, 31 Jan 2018 16:05:05 +0200 Subject: [PATCH 001/105] Updating README.md Reworded opening paragraph. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5036567c6..360ec5f52 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ MessagePack for C#(.NET, .NET Core, Unity, Xamarin) [![AppVeyor](https://img.shields.io/appveyor/ci/neuecc/messagepack-csharp/master.svg?label=appveyor)](https://ci.appveyor.com/project/neuecc/messagepack-csharp/branch/master) [![Join the chat at https://gitter.im/MessagePack-CSharp/Lobby](https://badges.gitter.im/MessagePack-CSharp/Lobby.svg)](https://gitter.im/MessagePack-CSharp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Releases](https://img.shields.io/github/release/neuecc/MessagePack-CSharp.svg)](https://github.com/neuecc/MessagePack-CSharp/releases) -Extremely fast [MessagePack](http://msgpack.org/) serializer for C#, x10 faster than MsgPack-Cli and acquires best performance compared with all the other C# serializers. MessagePack for C# has built-in LZ4 compression which can achieve super fast and small binary size. Performance is always important! for Game, Distributed computing, Microservices, Store data to Redis, etc. +The extremely fast [MessagePack](http://msgpack.org/) serializer for C#. It is 10x faster than [MsgPack-Cli](https://github.com/msgpack/msgpack-cli) and performs the best when compared with other C# serializers. MessagePack for C# also has built-in, super-quick LZ4 compression. Performance is important, particularly in applications like game development, distributed computing, microservice architecture, and caching. ![image](https://cloud.githubusercontent.com/assets/46207/23835716/89c8ab08-07af-11e7-9183-9e9415bdc87f.png) MessagePack has compact binary size and full set of general purpose expression. Please see the [comparison with JSON, protobuf, ZeroFormatter section](https://github.com/neuecc/MessagePack-CSharp#compare-with-protobuf-json-zeroformatter). If you want to know why MessagePack C# is fastest, please see [performance section](https://github.com/neuecc/MessagePack-CSharp#performance). -Install +Installation --- The library provides in NuGet except for Unity. From fc4b41ee7aa2714833128b06d19090314a3deaff Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 1 Feb 2018 08:32:40 +0200 Subject: [PATCH 002/105] Introduction paragraph --- .vscode/launch.json | 28 ++++++++++++++++++++++++++++ .vscode/tasks.json | 15 +++++++++++++++ README.md | 4 ++-- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..e043628e8 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/sandbox/Sandbox/bin/Debug/netcoreapp2.0/Sandbox.dll", + "args": [], + "cwd": "${workspaceFolder}/sandbox/Sandbox", + // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window + "console": "internalConsole", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart" + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..b7547cbe3 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "taskName": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/sandbox/Sandbox/Sandbox.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 360ec5f52..f785d94fe 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -MessagePack for C#(.NET, .NET Core, Unity, Xamarin) +MessagePack for C# (.NET, .NET Core, Unity, Xamarin) === [![AppVeyor](https://img.shields.io/appveyor/ci/neuecc/messagepack-csharp/master.svg?label=appveyor)](https://ci.appveyor.com/project/neuecc/messagepack-csharp/branch/master) [![Join the chat at https://gitter.im/MessagePack-CSharp/Lobby](https://badges.gitter.im/MessagePack-CSharp/Lobby.svg)](https://gitter.im/MessagePack-CSharp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Releases](https://img.shields.io/github/release/neuecc/MessagePack-CSharp.svg)](https://github.com/neuecc/MessagePack-CSharp/releases) -The extremely fast [MessagePack](http://msgpack.org/) serializer for C#. It is 10x faster than [MsgPack-Cli](https://github.com/msgpack/msgpack-cli) and performs the best when compared with other C# serializers. MessagePack for C# also has built-in, super-quick LZ4 compression. Performance is important, particularly in applications like game development, distributed computing, microservice architecture, and caching. +The extremely fast [MessagePack](http://msgpack.org/) serializer for C#. It is 10x faster than [MsgPack-Cli](https://github.com/msgpack/msgpack-cli) and outperforms other C# serializers. MessagePack for C# also ships with built-in support for LZ4 compression - an extremely fast compression algorithm. Performance is important, particularly in applications like game development, distributed computing, microservice architecture, and caching. ![image](https://cloud.githubusercontent.com/assets/46207/23835716/89c8ab08-07af-11e7-9183-9e9415bdc87f.png) From 22f37499392ba3f82c26f5f7702fed0491f341ed Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 1 Feb 2018 08:38:14 +0200 Subject: [PATCH 003/105] Added vscode to gitignore --- .gitignore | 7 +++++++ .vscode/launch.json | 28 ---------------------------- .vscode/tasks.json | 15 --------------- 3 files changed, 7 insertions(+), 43 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/tasks.json diff --git a/.gitignore b/.gitignore index 001281316..5983dad8d 100644 --- a/.gitignore +++ b/.gitignore @@ -275,3 +275,10 @@ nuget/tools/* nuget/unity/tools/* nuget/unity* /nuget/*.unitypackage + +# VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index e043628e8..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - // Use IntelliSense to find out which attributes exist for C# debugging - // Use hover for the description of the existing attributes - // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Launch (console)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/sandbox/Sandbox/bin/Debug/netcoreapp2.0/Sandbox.dll", - "args": [], - "cwd": "${workspaceFolder}/sandbox/Sandbox", - // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window - "console": "internalConsole", - "stopAtEntry": false, - "internalConsoleOptions": "openOnSessionStart" - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": "${command:pickProcess}" - } - ] -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index b7547cbe3..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "taskName": "build", - "command": "dotnet", - "type": "process", - "args": [ - "build", - "${workspaceFolder}/sandbox/Sandbox/Sandbox.csproj" - ], - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file From f62402db8aae07ba2d6e1ed3c9c49f286b99075e Mon Sep 17 00:00:00 2001 From: Jakub Holovsky Date: Wed, 7 Feb 2018 09:19:02 +0100 Subject: [PATCH 004/105] typo in readme fixed MessaegPackFormatterAttribute fixed a typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5036567c6..760a45bca 100644 --- a/README.md +++ b/README.md @@ -1036,9 +1036,9 @@ internal static class SampleCustomResolverGetFormatterHelper } ``` -MessaegPackFormatterAttribute +MessagePackFormatterAttribute --- -MessaegPackFormatterAttribute is lightweight extension point of class, struct, interface, enum and property/field. This is like JSON.NET's JsonConverterAttribute. For example, serialize private field, serialize x10 formatter. +MessagePackFormatterAttribute is lightweight extension point of class, struct, interface, enum and property/field. This is like JSON.NET's JsonConverterAttribute. For example, serialize private field, serialize x10 formatter. ```csharp [MessagePackFormatter(typeof(CustomObjectFormatter))] From 08a7070cb8e00b0f0c486dff1df29d8d7d213d31 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Tue, 6 Mar 2018 16:44:38 +0900 Subject: [PATCH 005/105] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58b4126d6..59df047aa 100644 --- a/README.md +++ b/README.md @@ -477,7 +477,7 @@ Type information is serialized by mspgack `ext` format, typecode is 100. TypelessFormatter can use standalone and combinate with existing resolvers. -``csharp +```csharp // replace `object` uses typeless MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault( new[] { MessagePack.Formatters.TypelessFormatter.Instance }, From 2401646def8b58b63823fbc1aa6e068caf8e1e44 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Fri, 9 Mar 2018 15:21:12 +0900 Subject: [PATCH 006/105] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 59df047aa..ebf8b15ab 100644 --- a/README.md +++ b/README.md @@ -735,10 +735,11 @@ Author is creating other extension packages, too. * [MagicOnion](https://github.com/neuecc/MagicOnion) - gRPC based HTTP/2 RPC Streaming Framework * [DatadogSharp](https://github.com/neuecc/DatadogSharp) - C# Datadog client -You can make your own extension serializers, let's create them and share it! +You can make your own extension serializers or integrate with framework, let's create them and share it! * [pocketberserker/MessagePack.FSharpExtensions](https://github.com/pocketberserker/MessagePack.FSharpExtensions) - supports F# list,set,map,unit,option,discriminated union * [WebApiContrib.Core.Formatter.MessagePack](https://github.com/WebApiContrib/WebAPIContrib.Core#formatters) - supports ASP.NET Core MVC([details in blog post](https://www.strathweb.com/2017/06/using-messagepack-with-asp-net-core-mvc/)) +* [sketch7/MessagePack.MediaTypeFormatter](https://github.com/sketch7/MessagePack.MediaTypeFormatter) - MessagePack MediaTypeFormatter High-Level API(MessagePackSerializer) --- From bff2ea3eb2051614f1d9cd336f1a4fb1deafe535 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Tue, 3 Apr 2018 22:59:22 +0900 Subject: [PATCH 007/105] [WIP]Add ContractlessReflectionObjectResolver #223 --- .../MessagePackSerializer.NonGeneric.cs | 43 +++ src/MessagePack/MessagePackSerializer.cs | 16 + .../ContractlessReflectionObjectResolver.cs | 303 ++++++++++++++++++ .../Resolvers/DynamicObjectResolver.cs | 24 ++ 4 files changed, 386 insertions(+) create mode 100644 src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs diff --git a/src/MessagePack/MessagePackSerializer.NonGeneric.cs b/src/MessagePack/MessagePackSerializer.NonGeneric.cs index cfda0a085..110203af7 100644 --- a/src/MessagePack/MessagePackSerializer.NonGeneric.cs +++ b/src/MessagePack/MessagePackSerializer.NonGeneric.cs @@ -13,6 +13,9 @@ public static partial class MessagePackSerializer { public static class NonGeneric { + delegate int RawFormatterSerialize(ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver); + delegate object RawFormatterDeserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize); + static readonly Func CreateCompiledMethods; static readonly MessagePack.Internal.ThreadsafeTypeKeyHashTable serializes = new MessagePack.Internal.ThreadsafeTypeKeyHashTable(capacity: 64); @@ -41,6 +44,11 @@ public static void Serialize(Type type, Stream stream, object obj, IFormatterRes GetOrAdd(type).serialize4.Invoke(stream, obj, resolver); } + public static int Serialize(Type type, ref byte[] bytes, int offset, object value, IFormatterResolver resolver) + { + return GetOrAdd(type).serialize5.Invoke(ref bytes, offset, value, resolver); + } + public static object Deserialize(Type type, byte[] bytes) { return GetOrAdd(type).deserialize1.Invoke(bytes); @@ -81,6 +89,11 @@ public static object Deserialize(Type type, ArraySegment bytes, IFormatter return GetOrAdd(type).deserialize8.Invoke(bytes, resolver); } + public static object Deserialize(Type type, byte[] bytes, int offset, IFormatterResolver resolver, out int readSize) + { + return GetOrAdd(type).deserialize9.Invoke(bytes, offset, resolver, out readSize); + } + static CompiledMethods GetOrAdd(Type type) { return serializes.GetOrAdd(type, CreateCompiledMethods); @@ -92,6 +105,7 @@ class CompiledMethods public readonly Func serialize2; public readonly Action serialize3; public readonly Action serialize4; + public readonly RawFormatterSerialize serialize5; public readonly Func deserialize1; public readonly Func deserialize2; @@ -102,6 +116,7 @@ class CompiledMethods public readonly Func, object> deserialize7; public readonly Func, IFormatterResolver, object> deserialize8; + public readonly RawFormatterDeserialize deserialize9; public CompiledMethods(Type type) { @@ -161,7 +176,22 @@ public CompiledMethods(Type type) this.serialize4 = lambda; } + { + // delegate int RawFormatterSerialize(ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver); + var serialize = GetMethod(type, new Type[] { typeof(byte[]).MakeByRefType(), typeof(int), null, typeof(IFormatterResolver) }); + var param1 = Expression.Parameter(typeof(byte[]).MakeByRefType(), "bytes"); + var param2 = Expression.Parameter(typeof(int), "offset"); + var param3 = Expression.Parameter(typeof(object), "value"); + var param4 = Expression.Parameter(typeof(IFormatterResolver), "formatterResolver"); + + var body = Expression.Call(serialize, param1, param2, ti.IsValueType + ? Expression.Unbox(param3, type) + : Expression.Convert(param3, type), param4); + var lambda = Expression.Lambda(body, param1, param2, param3, param4).Compile(); + + this.serialize5 = lambda; + } { // public static T Deserialize(byte[] bytes) var deserialize = GetMethod(type, new Type[] { typeof(byte[]) }); @@ -249,6 +279,19 @@ public CompiledMethods(Type type) this.deserialize8 = lambda; } + { + // public static T Deserialize(byte[] bytes, int offset, IFormatterResolver resolver, out int readSize) + var deserialize = GetMethod(type, new Type[] { typeof(byte[]), typeof(int), typeof(IFormatterResolver), typeof(int).MakeByRefType() }); + + var param1 = Expression.Parameter(typeof(byte[]), "bytes"); + var param2 = Expression.Parameter(typeof(int), "offset"); + var param3 = Expression.Parameter(typeof(IFormatterResolver), "resolver"); + var param4 = Expression.Parameter(typeof(int).MakeByRefType(), "readSize"); + var body = Expression.Convert(Expression.Call(deserialize, param1, param2, param3, param4), typeof(object)); + var lambda = Expression.Lambda(body, param1, param2, param3, param4).Compile(); + + this.deserialize9 = lambda; + } } // null is generic type marker. diff --git a/src/MessagePack/MessagePackSerializer.cs b/src/MessagePack/MessagePackSerializer.cs index e80aed5c4..33de750e2 100644 --- a/src/MessagePack/MessagePackSerializer.cs +++ b/src/MessagePack/MessagePackSerializer.cs @@ -119,6 +119,14 @@ public static void Serialize(Stream stream, T obj, IFormatterResolver resolve stream.Write(buffer, 0, len); } + /// + /// Reflect of resolver.GetFormatterWithVerify[T].Serialize. + /// + public static int Serialize(ref byte[] bytes, int offset, T value, IFormatterResolver resolver) + { + return resolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value, resolver); + } + #if NETSTANDARD /// @@ -238,6 +246,14 @@ public static T Deserialize(Stream stream, IFormatterResolver resolver, bool } } + /// + /// Reflect of resolver.GetFormatterWithVerify[T].Deserialize. + /// + public static T Deserialize(byte[] bytes, int offset, IFormatterResolver resolver, out int readSize) + { + return resolver.GetFormatterWithVerify().Deserialize(bytes, offset, resolver, out readSize); + } + #if NETSTANDARD public static System.Threading.Tasks.Task DeserializeAsync(Stream stream) diff --git a/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs b/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs new file mode 100644 index 000000000..c27887b90 --- /dev/null +++ b/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs @@ -0,0 +1,303 @@ +#if NETSTANDARD + +using MessagePack.Formatters; +using MessagePack.Internal; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MessagePack.Resolvers +{ + public static class ContractlessReflectionObjectResolver + { + // TODO:CamelCase Option? AllowPrivate? + public static readonly IFormatterResolver Default = new DefaultResolver(); + public static readonly IFormatterResolver Contractless = new ContractlessResolver(); + public static readonly IFormatterResolver ContractlessForceStringKey = new ContractlessForceStringResolver(); + + class DefaultResolver : IFormatterResolver + { + const bool ForceStringKey = false; + const bool Contractless = false; + const bool AllowPrivate = false; + + public IMessagePackFormatter GetFormatter() + { + return Cache.formatter; + } + + static class Cache + { + public static readonly IMessagePackFormatter formatter; + + static Cache() + { + var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); + if (metaInfo != null) + { + formatter = new ReflectionObjectFormatter(metaInfo); + } + } + } + } + + class ContractlessResolver : IFormatterResolver + { + const bool ForceStringKey = false; + const bool Contractless = true; + const bool AllowPrivate = false; + + public IMessagePackFormatter GetFormatter() + { + return Cache.formatter; + } + + static class Cache + { + public static readonly IMessagePackFormatter formatter; + + static Cache() + { + var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); + if (metaInfo != null) + { + formatter = new ReflectionObjectFormatter(metaInfo); + } + } + } + } + + class ContractlessForceStringResolver : IFormatterResolver + { + const bool ForceStringKey = true; + const bool Contractless = true; + const bool AllowPrivate = false; + + public IMessagePackFormatter GetFormatter() + { + return Cache.formatter; + } + + static class Cache + { + public static readonly IMessagePackFormatter formatter; + + static Cache() + { + var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); + if (metaInfo != null) + { + formatter = new ReflectionObjectFormatter(metaInfo); + } + } + } + } + + } + + + public class ReflectionObjectFormatter : IMessagePackFormatter + { + readonly ObjectSerializationInfo metaInfo; + + // for write + readonly byte[][] writeMemberNames; + readonly ObjectSerializationInfo.EmittableMember[] writeMembers; + + // for read + readonly int[] constructorParameterIndexes; + readonly AutomataDictionary mapMemberDictionary; + readonly ObjectSerializationInfo.EmittableMember[] readMembers; + + + internal ReflectionObjectFormatter(ObjectSerializationInfo metaInfo) + { + this.metaInfo = metaInfo; + + // for write + { + var memberNameList = new List(metaInfo.Members.Length); + var emmitableMemberList = new List(metaInfo.Members.Length); + foreach (var item in metaInfo.Members) + { + if (item.IsWritable) + { + emmitableMemberList.Add(item); + memberNameList.Add(Encoding.UTF8.GetBytes(item.Name)); + } + } + this.writeMemberNames = memberNameList.ToArray(); + this.writeMembers = emmitableMemberList.ToArray(); + } + // for read + { + var automata = new AutomataDictionary(); + var emmitableMemberList = new List(metaInfo.Members.Length); + int index = 0; + foreach (var item in metaInfo.Members) + { + if (item.IsReadable) + { + emmitableMemberList.Add(item); + automata.Add(item.Name, index++); + } + } + this.readMembers = emmitableMemberList.ToArray(); + this.mapMemberDictionary = automata; + } + } + + public int Serialize(ref byte[] bytes, int offset, T value, IFormatterResolver formatterResolver) + { + // reduce generic method size, avoid write code in type. + if (metaInfo.IsIntKey) + { + return ReflectionObjectFormatterHelper.WriteArraySerialize(metaInfo, writeMembers, ref bytes, offset, value, formatterResolver); + } + else + { + return ReflectionObjectFormatterHelper.WriteMapSerialize(metaInfo, writeMembers, writeMemberNames, ref bytes, offset, value, formatterResolver); + } + } + + public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) + { + return (T)ReflectionObjectFormatterHelper.Deserialize(metaInfo, readMembers, constructorParameterIndexes, mapMemberDictionary, bytes, offset, formatterResolver, out readSize); + } + } + + internal static class ReflectionObjectFormatterHelper + { + internal static int WriteArraySerialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] writeMembers, ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver) + { + var startOffset = offset; + + offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, writeMembers.Length); + foreach (var item in metaInfo.Members) + { + if (item == null) + { + offset += MessagePackBinary.WriteNil(ref bytes, offset); + } + else + { + var memberValue = item.ReflectionLoadValue(value); + offset += MessagePackSerializer.NonGeneric.Serialize(item.Type, ref bytes, offset, memberValue, formatterResolver); + } + } + + return offset - startOffset; + } + + internal static int WriteMapSerialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] writeMembers, byte[][] memberNames, ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver) + { + var startOffset = offset; + + offset += MessagePackBinary.WriteMapHeader(ref bytes, offset, writeMembers.Length); + + for (int i = 0; i < writeMembers.Length; i++) + { + offset += MessagePackBinary.WriteStringBytes(ref bytes, offset, memberNames[i]); + var memberValue = writeMembers[i].ReflectionLoadValue(value); + offset += MessagePackSerializer.NonGeneric.Serialize(writeMembers[i].Type, ref bytes, offset, memberValue, formatterResolver); + } + + return offset - startOffset; + } + + internal static object Deserialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] readMembers, int[] constructorParameterIndexes, AutomataDictionary mapMemberDictionary, byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) + { + var startOffset = offset; + object[] parameters = null; + + var headerType = MessagePackBinary.GetMessagePackType(bytes, offset); + if (headerType == MessagePackType.Nil) + { + readSize = 1; + return null; + } + else if (headerType == MessagePackType.Array) + { + var arraySize = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; + + // ReadValues + parameters = new object[arraySize]; + for (int i = 0; i < arraySize; i++) + { + var info = readMembers[i]; + if (info != null) + { + parameters[i] = MessagePackSerializer.NonGeneric.Deserialize(info.Type, bytes, offset, formatterResolver, out readSize); + offset += readSize; + } + else + { + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + } + } + } + else if (headerType == MessagePackType.Map) + { + var mapSize = MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); + offset += readSize; + + // ReadValues + parameters = new object[mapSize]; + for (int i = 0; i < mapSize; i++) + { + var rawPropName = MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + + int index; + if (mapMemberDictionary.TryGetValue(rawPropName.Array, rawPropName.Offset, rawPropName.Count, out index)) + { + var info = readMembers[index]; + parameters[index] = MessagePackSerializer.NonGeneric.Deserialize(info.Type, bytes, offset, formatterResolver, out readSize); + offset += readSize; + } + else + { + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + } + } + } + else + { + throw new InvalidOperationException("Invalid MessagePackType:" + MessagePackCode.ToFormatName(bytes[offset])); + } + + // CreateObject + object result = null; + if (constructorParameterIndexes.Length == 0) + { + result = Activator.CreateInstance(metaInfo.Type); + } + else + { + var args = new object[constructorParameterIndexes.Length]; + for (int i = 0; i < constructorParameterIndexes.Length; i++) + { + args[i] = parameters[constructorParameterIndexes[i]]; + } + + result = Activator.CreateInstance(metaInfo.Type, args); + } + + // SetMembers + for (int i = 0; i < readMembers.Length; i++) + { + var info = readMembers[i]; + if (info != null) + { + info.ReflectionStoreValue(result, parameters[i]); + } + } + + readSize = offset - startOffset; + return result; + } + } +} + +#endif \ No newline at end of file diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index 6467b7db6..af8d3938e 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -1801,6 +1801,30 @@ public void EmitStoreValue(ILGenerator il) il.Emit(OpCodes.Stfld, FieldInfo); } } + + public object ReflectionLoadValue(object value) + { + if (IsProperty) + { + return PropertyInfo.GetValue(value); + } + else + { + return FieldInfo.GetValue(value); + } + } + + public void ReflectionStoreValue(object obj, object value) + { + if (IsProperty) + { + PropertyInfo.SetValue(obj, value); + } + else + { + FieldInfo.SetValue(obj, value); + } + } } } From 80d3bf2d53dd396aeab44279efdee6d8d812fd31 Mon Sep 17 00:00:00 2001 From: reniris Date: Tue, 24 Apr 2018 01:30:59 +0900 Subject: [PATCH 008/105] =?UTF-8?q?ReactivePropertySlim=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nuget/MessagePack.ReactiveProperty.nuspec | 8 +- .../MessagePack.ReactiveProperty.csproj | 63 ++++++++++----- .../ReactivePropertySlimResolver.cs | 64 ++++++++++++++++ .../SlimFormatter.cs | 76 +++++++++++++++++++ .../MessagePack.Tests.csproj | 8 +- tests/MessagePack.Tests/packages.config | 2 +- 6 files changed, 192 insertions(+), 29 deletions(-) create mode 100644 src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs create mode 100644 src/MessagePack.ReactiveProperty/SlimFormatter.cs diff --git a/nuget/MessagePack.ReactiveProperty.nuspec b/nuget/MessagePack.ReactiveProperty.nuspec index 680e786ab..50b1a5f45 100644 --- a/nuget/MessagePack.ReactiveProperty.nuspec +++ b/nuget/MessagePack.ReactiveProperty.nuspec @@ -17,19 +17,19 @@ - + - + - + - + diff --git a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj index 7e810a393..6f06a7b69 100644 --- a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj +++ b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj @@ -1,24 +1,47 @@  - - netstandard1.6;netstandard2.0;net45;net47 - True - ..\..\opensource.snk - false - - - - bin\Release\netstandard2.0\MessagePack.ReactiveProperty.xml - 1701;1702;1705;1591 - - - - - - - - - - + + netstandard1.6;netstandard2.0;net46;net47 + True + ..\..\opensource.snk + false + + + + bin\Release\netstandard2.0\MessagePack.ReactiveProperty.xml + 1701;1702;1705;1591 + + + + + + + + + + + + + 4.2.2 + + + + + + 4.2.2 + + + + + + 4.2.2 + + + + + + 4.2.2 + + \ No newline at end of file diff --git a/src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs b/src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs new file mode 100644 index 000000000..8f13de409 --- /dev/null +++ b/src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Reactive; +using System.Reflection; +using System.Text; +using MessagePack.Formatters; +using Reactive.Bindings; + +namespace MessagePack.ReactivePropertyExtension +{ + public class ReactivePropertySlimResolver : IFormatterResolver + { + public static IFormatterResolver Instance = new ReactivePropertySlimResolver(); + + ReactivePropertySlimResolver() + { + + } + + public IMessagePackFormatter GetFormatter() + { + return FormatterCache.formatter; + } + + static class FormatterCache + { + public static readonly IMessagePackFormatter formatter; + + static FormatterCache() + { + formatter = (IMessagePackFormatter)ReactivePropertySlimResolverGetFormatterHelper.GetFormatter(typeof(T)); + } + } + } + + internal static class ReactivePropertySlimResolverGetFormatterHelper + { + static readonly Dictionary formatterMap = new Dictionary() + { + {typeof(ReactivePropertySlim<>), typeof(ReactivePropertySlimFormatter<>)}, + }; + + internal static object GetFormatter(Type t) + { + var ti = t.GetTypeInfo(); + + if (ti.IsGenericType) + { + var genericType = ti.GetGenericTypeDefinition(); + if (formatterMap.TryGetValue(genericType, out Type formatterType)) + { + return CreateInstance(formatterType, ti.GenericTypeArguments); + } + } + + return null; + } + + static object CreateInstance(Type genericType, Type[] genericTypeArguments, params object[] arguments) + { + return Activator.CreateInstance(genericType.MakeGenericType(genericTypeArguments), arguments); + } + } +} diff --git a/src/MessagePack.ReactiveProperty/SlimFormatter.cs b/src/MessagePack.ReactiveProperty/SlimFormatter.cs new file mode 100644 index 000000000..ab3f368d9 --- /dev/null +++ b/src/MessagePack.ReactiveProperty/SlimFormatter.cs @@ -0,0 +1,76 @@ +using MessagePack.Formatters; +using Reactive.Bindings; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MessagePack.ReactivePropertyExtension +{ + // [Mode, Value] + public class ReactivePropertySlimFormatter : IMessagePackFormatter> + { + public int Serialize(ref byte[] bytes, int offset, ReactivePropertySlim value, IFormatterResolver formatterResolver) + { + if (value == null) + { + return MessagePackBinary.WriteNil(ref bytes, offset); + } + else + { + var startOffset = offset; + + offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); + + offset += MessagePackBinary.WriteInt32(ref bytes, offset, ReactivePropertySlimModeMapper.ToReactivePropertySlimModeInt(value)); + offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Value, formatterResolver); + + return offset - startOffset; + } + } + + public ReactivePropertySlim Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) + { + if (MessagePackBinary.IsNil(bytes, offset)) + { + readSize = 1; + return null; + } + else + { + var startOffset = offset; + + var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; + if (length != 2) throw new InvalidOperationException("Invalid ReactivePropertySlim data."); + + var mode = (ReactivePropertyMode)MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; + + var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + + return new ReactivePropertySlim(v, mode); + } + + } + } + + public static class ReactivePropertySlimModeMapper + { + internal static int ToReactivePropertySlimModeInt(global::Reactive.Bindings.ReactivePropertySlim reactiveProperty) + { + var mode = ReactivePropertyMode.None; + if (reactiveProperty.IsDistinctUntilChanged) + { + mode |= ReactivePropertyMode.DistinctUntilChanged; + } + if (reactiveProperty.IsRaiseLatestValueOnSubscribe) + { + mode |= ReactivePropertyMode.RaiseLatestValueOnSubscribe; + } + return (int)mode; + } + } +} diff --git a/tests/MessagePack.Tests/MessagePack.Tests.csproj b/tests/MessagePack.Tests/MessagePack.Tests.csproj index 283ff494a..d786f7410 100644 --- a/tests/MessagePack.Tests/MessagePack.Tests.csproj +++ b/tests/MessagePack.Tests/MessagePack.Tests.csproj @@ -47,11 +47,11 @@ - - ..\..\packages\ReactiveProperty.3.5.1\lib\net46\ReactiveProperty.dll + + ..\..\packages\ReactiveProperty.4.2.2\lib\net46\ReactiveProperty.dll - - ..\..\packages\ReactiveProperty.3.5.1\lib\net46\ReactiveProperty.NET46.dll + + ..\..\packages\ReactiveProperty.4.2.2\lib\net46\ReactiveProperty.NET46.dll diff --git a/tests/MessagePack.Tests/packages.config b/tests/MessagePack.Tests/packages.config index a19a49738..d3c74e952 100644 --- a/tests/MessagePack.Tests/packages.config +++ b/tests/MessagePack.Tests/packages.config @@ -1,7 +1,7 @@  - + From 8f8396e418039778aa07fe5797cb3ad473d4a266 Mon Sep 17 00:00:00 2001 From: reniris Date: Wed, 25 Apr 2018 23:55:55 +0900 Subject: [PATCH 009/105] =?UTF-8?q?ReactivePropertyResolver=E3=81=AB?= =?UTF-8?q?=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Formatters.cs | 65 ++++++++++++++++ .../MessagePack.ReactiveProperty.csproj | 5 ++ .../ReactivePropertyResolver.cs | 1 + .../ReactivePropertySlimResolver.cs | 64 ---------------- .../SlimFormatter.cs | 76 ------------------- 5 files changed, 71 insertions(+), 140 deletions(-) delete mode 100644 src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs delete mode 100644 src/MessagePack.ReactiveProperty/SlimFormatter.cs diff --git a/src/MessagePack.ReactiveProperty/Formatters.cs b/src/MessagePack.ReactiveProperty/Formatters.cs index a2446ee79..0b1380637 100644 --- a/src/MessagePack.ReactiveProperty/Formatters.cs +++ b/src/MessagePack.ReactiveProperty/Formatters.cs @@ -84,6 +84,20 @@ internal static int ToReactivePropertyModeInt(global::Reactive.Bindings.React return (int)mode; } + + internal static int ToReactivePropertySlimModeInt(global::Reactive.Bindings.ReactivePropertySlim reactiveProperty) + { + var mode = ReactivePropertyMode.None; + if (reactiveProperty.IsDistinctUntilChanged) + { + mode |= ReactivePropertyMode.DistinctUntilChanged; + } + if (reactiveProperty.IsRaiseLatestValueOnSubscribe) + { + mode |= ReactivePropertyMode.RaiseLatestValueOnSubscribe; + } + return (int)mode; + } } // [Mode, SchedulerId, Value] : length should be three. @@ -263,4 +277,55 @@ public int Serialize(ref byte[] bytes, int offset, Unit? value, IFormatterResolv } } } + + // [Mode, Value] + public class ReactivePropertySlimFormatter : IMessagePackFormatter> + { + public int Serialize(ref byte[] bytes, int offset, ReactivePropertySlim value, IFormatterResolver formatterResolver) + { + if (value == null) + { + return MessagePackBinary.WriteNil(ref bytes, offset); + } + else + { + var startOffset = offset; + + offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); + + offset += MessagePackBinary.WriteInt32(ref bytes, offset, ReactivePropertySchedulerMapper.ToReactivePropertySlimModeInt(value)); + offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Value, formatterResolver); + + return offset - startOffset; + } + } + + public ReactivePropertySlim Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) + { + if (MessagePackBinary.IsNil(bytes, offset)) + { + readSize = 1; + return null; + } + else + { + var startOffset = offset; + + var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; + if (length != 2) throw new InvalidOperationException("Invalid ReactivePropertySlim data."); + + var mode = (ReactivePropertyMode)MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; + + var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + + return new ReactivePropertySlim(v, mode); + } + + } + } } \ No newline at end of file diff --git a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj index 6f06a7b69..ad8d2db1c 100644 --- a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj +++ b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj @@ -12,6 +12,11 @@ 1701;1702;1705;1591 + + + + + diff --git a/src/MessagePack.ReactiveProperty/ReactivePropertyResolver.cs b/src/MessagePack.ReactiveProperty/ReactivePropertyResolver.cs index 92536fd13..1c00d8675 100644 --- a/src/MessagePack.ReactiveProperty/ReactivePropertyResolver.cs +++ b/src/MessagePack.ReactiveProperty/ReactivePropertyResolver.cs @@ -40,6 +40,7 @@ internal static class ReactivePropertyResolverGetFormatterHelper {typeof(IReactiveProperty<>), typeof(InterfaceReactivePropertyFormatter<>)}, {typeof(IReadOnlyReactiveProperty<>), typeof(InterfaceReadOnlyReactivePropertyFormatter<>)}, {typeof(ReactiveCollection<>), typeof(ReactiveCollectionFormatter<>)}, + {typeof(ReactivePropertySlim<>), typeof(ReactivePropertySlimFormatter<>)}, }; internal static object GetFormatter(Type t) diff --git a/src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs b/src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs deleted file mode 100644 index 8f13de409..000000000 --- a/src/MessagePack.ReactiveProperty/ReactivePropertySlimResolver.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reactive; -using System.Reflection; -using System.Text; -using MessagePack.Formatters; -using Reactive.Bindings; - -namespace MessagePack.ReactivePropertyExtension -{ - public class ReactivePropertySlimResolver : IFormatterResolver - { - public static IFormatterResolver Instance = new ReactivePropertySlimResolver(); - - ReactivePropertySlimResolver() - { - - } - - public IMessagePackFormatter GetFormatter() - { - return FormatterCache.formatter; - } - - static class FormatterCache - { - public static readonly IMessagePackFormatter formatter; - - static FormatterCache() - { - formatter = (IMessagePackFormatter)ReactivePropertySlimResolverGetFormatterHelper.GetFormatter(typeof(T)); - } - } - } - - internal static class ReactivePropertySlimResolverGetFormatterHelper - { - static readonly Dictionary formatterMap = new Dictionary() - { - {typeof(ReactivePropertySlim<>), typeof(ReactivePropertySlimFormatter<>)}, - }; - - internal static object GetFormatter(Type t) - { - var ti = t.GetTypeInfo(); - - if (ti.IsGenericType) - { - var genericType = ti.GetGenericTypeDefinition(); - if (formatterMap.TryGetValue(genericType, out Type formatterType)) - { - return CreateInstance(formatterType, ti.GenericTypeArguments); - } - } - - return null; - } - - static object CreateInstance(Type genericType, Type[] genericTypeArguments, params object[] arguments) - { - return Activator.CreateInstance(genericType.MakeGenericType(genericTypeArguments), arguments); - } - } -} diff --git a/src/MessagePack.ReactiveProperty/SlimFormatter.cs b/src/MessagePack.ReactiveProperty/SlimFormatter.cs deleted file mode 100644 index ab3f368d9..000000000 --- a/src/MessagePack.ReactiveProperty/SlimFormatter.cs +++ /dev/null @@ -1,76 +0,0 @@ -using MessagePack.Formatters; -using Reactive.Bindings; -using System; -using System.Collections.Generic; -using System.Text; - -namespace MessagePack.ReactivePropertyExtension -{ - // [Mode, Value] - public class ReactivePropertySlimFormatter : IMessagePackFormatter> - { - public int Serialize(ref byte[] bytes, int offset, ReactivePropertySlim value, IFormatterResolver formatterResolver) - { - if (value == null) - { - return MessagePackBinary.WriteNil(ref bytes, offset); - } - else - { - var startOffset = offset; - - offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); - - offset += MessagePackBinary.WriteInt32(ref bytes, offset, ReactivePropertySlimModeMapper.ToReactivePropertySlimModeInt(value)); - offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Value, formatterResolver); - - return offset - startOffset; - } - } - - public ReactivePropertySlim Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) - { - if (MessagePackBinary.IsNil(bytes, offset)) - { - readSize = 1; - return null; - } - else - { - var startOffset = offset; - - var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - if (length != 2) throw new InvalidOperationException("Invalid ReactivePropertySlim data."); - - var mode = (ReactivePropertyMode)MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; - - var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - - return new ReactivePropertySlim(v, mode); - } - - } - } - - public static class ReactivePropertySlimModeMapper - { - internal static int ToReactivePropertySlimModeInt(global::Reactive.Bindings.ReactivePropertySlim reactiveProperty) - { - var mode = ReactivePropertyMode.None; - if (reactiveProperty.IsDistinctUntilChanged) - { - mode |= ReactivePropertyMode.DistinctUntilChanged; - } - if (reactiveProperty.IsRaiseLatestValueOnSubscribe) - { - mode |= ReactivePropertyMode.RaiseLatestValueOnSubscribe; - } - return (int)mode; - } - } -} From e76c2ad02f4dce7341670c7dc462284dfbaeb706 Mon Sep 17 00:00:00 2001 From: reniris Date: Thu, 26 Apr 2018 00:18:07 +0900 Subject: [PATCH 010/105] =?UTF-8?q?InterfaceReactiveProperty=E3=81=AE?= =?UTF-8?q?=E3=82=B7=E3=83=AA=E3=82=A2=E3=83=A9=E3=82=A4=E3=82=BA=E3=80=81?= =?UTF-8?q?=E3=83=87=E3=82=B7=E3=83=AA=E3=82=A2=E3=83=A9=E3=82=A4=E3=82=BA?= =?UTF-8?q?=E3=82=92ReactiveProperty=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Formatters.cs | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/MessagePack.ReactiveProperty/Formatters.cs b/src/MessagePack.ReactiveProperty/Formatters.cs index 0b1380637..334e2a1cc 100644 --- a/src/MessagePack.ReactiveProperty/Formatters.cs +++ b/src/MessagePack.ReactiveProperty/Formatters.cs @@ -167,19 +167,35 @@ public int Serialize(ref byte[] bytes, int offset, IReactiveProperty value, I return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Serialize(ref bytes, offset, rxProp, formatterResolver); } + var slimProp = value as ReactivePropertySlim; + if (slimProp != null) + { + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Serialize(ref bytes, offset, slimProp, formatterResolver); + } + if (value == null) { return MessagePackBinary.WriteNil(ref bytes, offset); } else { - throw new InvalidOperationException("Serializer only supports ReactiveProperty. If serialize is ReadOnlyReactiveProperty, should mark [Ignore] and restore on IMessagePackSerializationCallbackReceiver.OnAfterDeserialize. Type:" + value.GetType().Name); + throw new InvalidOperationException("Serializer only supports ReactiveProperty or ReactivePropertySlim. If serialize is ReadOnlyReactiveProperty, should mark [Ignore] and restore on IMessagePackSerializationCallbackReceiver.OnAfterDeserialize. Type:" + value.GetType().Name); } } public IReactiveProperty Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) { - return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + + switch (length) + { + case 2: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + case 3: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + default: + throw new InvalidOperationException("Invalid ReactiveProperty or ReactivePropertySlim data."); + } } } @@ -193,19 +209,35 @@ public int Serialize(ref byte[] bytes, int offset, IReadOnlyReactiveProperty return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Serialize(ref bytes, offset, rxProp, formatterResolver); } + var slimProp = value as ReactivePropertySlim; + if (slimProp != null) + { + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Serialize(ref bytes, offset, slimProp, formatterResolver); + } + if (value == null) { return MessagePackBinary.WriteNil(ref bytes, offset); } else { - throw new InvalidOperationException("Serializer only supports ReactiveProperty. If serialize is ReadOnlyReactiveProperty, should mark [Ignore] and restore on IMessagePackSerializationCallbackReceiver.OnAfterDeserialize. Type:" + value.GetType().Name); + throw new InvalidOperationException("Serializer only supports ReactiveProperty or ReactivePropertySlim. If serialize is ReadOnlyReactiveProperty, should mark [Ignore] and restore on IMessagePackSerializationCallbackReceiver.OnAfterDeserialize. Type:" + value.GetType().Name); } } public IReadOnlyReactiveProperty Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) { - return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + + switch (length) + { + case 2: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + case 3: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + default: + throw new InvalidOperationException("Invalid ReactiveProperty or ReactivePropertySlim data."); + } } } From 83af0a7f055557c91ef6407ebc27d3921f72ee04 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Thu, 7 Jun 2018 00:09:53 +0900 Subject: [PATCH 011/105] Update ReadMe - Add MessagePack.NodaTime --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ebf8b15ab..e80583b35 100644 --- a/README.md +++ b/README.md @@ -737,9 +737,11 @@ Author is creating other extension packages, too. You can make your own extension serializers or integrate with framework, let's create them and share it! -* [pocketberserker/MessagePack.FSharpExtensions](https://github.com/pocketberserker/MessagePack.FSharpExtensions) - supports F# list,set,map,unit,option,discriminated union +* [MessagePack.FSharpExtensions](https://github.com/pocketberserker/MessagePack.FSharpExtensions) - supports F# list,set,map,unit,option,discriminated union +* [MessagePack.NodaTime](https://github.com/ARKlab/MessagePack) - +Support for NodaTime types to MessagePack C# * [WebApiContrib.Core.Formatter.MessagePack](https://github.com/WebApiContrib/WebAPIContrib.Core#formatters) - supports ASP.NET Core MVC([details in blog post](https://www.strathweb.com/2017/06/using-messagepack-with-asp-net-core-mvc/)) -* [sketch7/MessagePack.MediaTypeFormatter](https://github.com/sketch7/MessagePack.MediaTypeFormatter) - MessagePack MediaTypeFormatter +* [MessagePack.MediaTypeFormatter](https://github.com/sketch7/MessagePack.MediaTypeFormatter) - MessagePack MediaTypeFormatter High-Level API(MessagePackSerializer) --- From f35e91f55bbc6e2940a7cf05256d29ee0650fb03 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sat, 21 Jul 2018 17:26:07 +1000 Subject: [PATCH 012/105] remove redundat refs --- src/MessagePack/MessagePack.csproj | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index d1bf88c7d..5cb9f544b 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -52,13 +52,19 @@ - - - - - - - + + + + + + + + + + + + + From 1e29676eb42ff8b1fb7c0d673ce096146d346e0b Mon Sep 17 00:00:00 2001 From: Kiyoaki Tsurutani Date: Fri, 17 Aug 2018 14:46:32 +0900 Subject: [PATCH 013/105] Fix typos --- .../CodeAnalysis/TypeCollector.cs | 30 +++++++++---------- src/MessagePackAnalyzer/DiagnosticAnalyzer.cs | 18 +++++------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs index a87facc89..e51ebf70d 100644 --- a/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs @@ -9,11 +9,11 @@ public class ReferenceSymbols { public readonly INamedTypeSymbol Task; public readonly INamedTypeSymbol TaskOfT; - public readonly INamedTypeSymbol MessagePackObjectAttribnute; + public readonly INamedTypeSymbol MessagePackObjectAttribute; public readonly INamedTypeSymbol UnionAttribute; public readonly INamedTypeSymbol SerializationConstructorAttribute; - public readonly INamedTypeSymbol KeyAttribnute; - public readonly INamedTypeSymbol IgnoreAttribnute; + public readonly INamedTypeSymbol KeyAttribute; + public readonly INamedTypeSymbol IgnoreAttribute; public readonly INamedTypeSymbol IgnoreDataMemberAttribute; public readonly INamedTypeSymbol IMessagePackSerializationCallbackReceiver; @@ -21,11 +21,11 @@ public ReferenceSymbols(Compilation compilation) { TaskOfT = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1"); Task = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task"); - MessagePackObjectAttribnute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); + MessagePackObjectAttribute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); UnionAttribute = compilation.GetTypeByMetadataName("MessagePack.UnionAttribute"); SerializationConstructorAttribute = compilation.GetTypeByMetadataName("MessagePack.SerializationConstructorAttribute"); - KeyAttribnute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); - IgnoreAttribnute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute"); + KeyAttribute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); + IgnoreAttribute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute"); IgnoreDataMemberAttribute = compilation.GetTypeByMetadataName("System.Runtime.Serialization.IgnoreDataMemberAttribute"); IMessagePackSerializationCallbackReceiver = compilation.GetTypeByMetadataName("MessagePack.IMessagePackSerializationCallbackReceiver"); } @@ -228,8 +228,8 @@ public TypeCollector(string csProjPath, IEnumerable conditinalSymbols, b .Where(x => ((x.TypeKind == TypeKind.Interface) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) || ((x.TypeKind == TypeKind.Class && x.IsAbstract) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) - || ((x.TypeKind == TypeKind.Class) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribnute)) - || ((x.TypeKind == TypeKind.Struct) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribnute)) + || ((x.TypeKind == TypeKind.Class) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) + || ((x.TypeKind == TypeKind.Struct) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) ) .ToArray(); } @@ -463,7 +463,7 @@ void CollectObject(INamedTypeSymbol type) { var isClass = !type.IsValueType; - var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribnute); + var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribute); if (contractAttr == null) { throw new MessagePackGeneratorResolveFailedException("Serialization Object must mark MessagePackObjectAttribute." + " type: " + type.Name); @@ -482,7 +482,7 @@ void CollectObject(INamedTypeSymbol type) foreach (var item in type.GetAllMembers().OfType().Where(x => !x.IsOverride)) { - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribnute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; var member = new MemberSerializationInfo { @@ -503,7 +503,7 @@ void CollectObject(INamedTypeSymbol type) } foreach (var item in type.GetAllMembers().OfType()) { - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribnute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; if (item.IsImplicitlyDeclared) continue; var member = new MemberSerializationInfo @@ -531,7 +531,7 @@ void CollectObject(INamedTypeSymbol type) foreach (var item in type.GetAllMembers().OfType()) { - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribnute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; var member = new MemberSerializationInfo { @@ -545,7 +545,7 @@ void CollectObject(INamedTypeSymbol type) }; if (!member.IsReadable && !member.IsWritable) continue; - var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribnute)?.ConstructorArguments[0]; + var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; @@ -587,7 +587,7 @@ void CollectObject(INamedTypeSymbol type) foreach (var item in type.GetAllMembers().OfType()) { if (item.IsImplicitlyDeclared) continue; - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribnute)) continue; + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute)) continue; var member = new MemberSerializationInfo { @@ -601,7 +601,7 @@ void CollectObject(INamedTypeSymbol type) }; if (!member.IsReadable && !member.IsWritable) continue; - var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribnute)?.ConstructorArguments[0]; + var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; diff --git a/src/MessagePackAnalyzer/DiagnosticAnalyzer.cs b/src/MessagePackAnalyzer/DiagnosticAnalyzer.cs index 3321c17c0..a054a30c9 100644 --- a/src/MessagePackAnalyzer/DiagnosticAnalyzer.cs +++ b/src/MessagePackAnalyzer/DiagnosticAnalyzer.cs @@ -73,8 +73,8 @@ static void Analyze(SyntaxNodeAnalysisContext context) if ( ((declaredSymbol.TypeKind == TypeKind.Interface) && declaredSymbol.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) - || ((declaredSymbol.TypeKind == TypeKind.Class) && declaredSymbol.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribnute)) - || ((declaredSymbol.TypeKind == TypeKind.Struct) && declaredSymbol.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribnute)) + || ((declaredSymbol.TypeKind == TypeKind.Class) && declaredSymbol.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) + || ((declaredSymbol.TypeKind == TypeKind.Struct) && declaredSymbol.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) ) { var reportContext = new DiagnosticsReportContext(context); @@ -89,10 +89,10 @@ public class ReferenceSymbols { public readonly INamedTypeSymbol Task; public readonly INamedTypeSymbol TaskOfT; - public readonly INamedTypeSymbol MessagePackObjectAttribnute; + public readonly INamedTypeSymbol MessagePackObjectAttribute; public readonly INamedTypeSymbol UnionAttribute; public readonly INamedTypeSymbol SerializationConstructorAttribute; - public readonly INamedTypeSymbol KeyAttribnute; + public readonly INamedTypeSymbol KeyAttribute; public readonly INamedTypeSymbol IgnoreAttribute; public readonly INamedTypeSymbol IgnoreDataMemberAttribute; public readonly INamedTypeSymbol IMessagePackSerializationCallbackReceiver; @@ -101,10 +101,10 @@ public ReferenceSymbols(Compilation compilation) { TaskOfT = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1"); Task = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task"); - MessagePackObjectAttribnute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); + MessagePackObjectAttribute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); UnionAttribute = compilation.GetTypeByMetadataName("MessagePack.UnionAttribute"); SerializationConstructorAttribute = compilation.GetTypeByMetadataName("MessagePack.SerializationConstructorAttribute"); - KeyAttribnute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); + KeyAttribute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); IgnoreAttribute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute"); IgnoreDataMemberAttribute = compilation.GetTypeByMetadataName("System.Runtime.Serialization.IgnoreDataMemberAttribute"); IMessagePackSerializationCallbackReceiver = compilation.GetTypeByMetadataName("MessagePack.IMessagePackSerializationCallbackReceiver"); @@ -296,7 +296,7 @@ void CollectObject(INamedTypeSymbol type, ISymbol callerSymbol) { var isClass = !type.IsValueType; - var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribnute); + var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribute); if (contractAttr == null) { var location = callerSymbol != null ? callerSymbol.Locations[0] : type.Locations[0]; @@ -356,7 +356,7 @@ void CollectObject(INamedTypeSymbol type, ISymbol callerSymbol) var Name = item.Name; if (!IsReadable && !IsWritable) continue; - var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribnute)?.ConstructorArguments[0]; + var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; if (key == null) { var typeInfo = ImmutableDictionary.Create().Add("type", type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); @@ -420,7 +420,7 @@ void CollectObject(INamedTypeSymbol type, ISymbol callerSymbol) var Name = item.Name; if (!IsReadable && !IsWritable) continue; - var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribnute)?.ConstructorArguments[0]; + var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; if (key == null) { var typeInfo = ImmutableDictionary.Create().Add("type", type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); From 30be89a1350365287c194b8c3c2466a70c13f661 Mon Sep 17 00:00:00 2001 From: Kiyoaki Tsurutani Date: Mon, 20 Aug 2018 13:45:18 +0900 Subject: [PATCH 014/105] Update Microsoft.Build packages to 15.8.166 --- src/MessagePack.CodeGenerator/App.config | 6 ++++- .../MessagePack.CodeGenerator.csproj | 27 ++++++++++++------- src/MessagePack.CodeGenerator/packages.config | 10 ++++--- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/MessagePack.CodeGenerator/App.config b/src/MessagePack.CodeGenerator/App.config index a3f639493..f276422ac 100644 --- a/src/MessagePack.CodeGenerator/App.config +++ b/src/MessagePack.CodeGenerator/App.config @@ -7,7 +7,7 @@ - + @@ -37,6 +37,10 @@ + + + + \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj index b9d588bdb..5e300aa95 100644 --- a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj +++ b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj @@ -39,19 +39,16 @@ ..\..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll - ..\..\packages\Microsoft.Build.Framework.15.6.0-preview-000022-1216653\lib\net46\Microsoft.Build.Framework.dll - True + ..\..\packages\Microsoft.Build.Framework.15.8.166\lib\net46\Microsoft.Build.Framework.dll ..\..\packages\Microsoft.Build.MSBuildLocator.1.0.1-preview-g6cd9a57801\lib\net46\Microsoft.Build.MSBuildLocator.dll - ..\..\packages\Microsoft.Build.Tasks.Core.15.6.0-preview-000022-1216653\lib\net46\Microsoft.Build.Tasks.Core.dll - True + ..\..\packages\Microsoft.Build.Tasks.Core.15.8.166\lib\net46\Microsoft.Build.Tasks.Core.dll - ..\..\packages\Microsoft.Build.Utilities.Core.15.6.0-preview-000022-1216653\lib\net46\Microsoft.Build.Utilities.Core.dll - True + ..\..\packages\Microsoft.Build.Utilities.Core.15.8.166\lib\net46\Microsoft.Build.Utilities.Core.dll ..\..\packages\Microsoft.CodeAnalysis.Common.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.dll @@ -74,6 +71,10 @@ ..\..\packages\Microsoft.VisualStudio.RemoteControl.14.0.262-masterA5CACE98\lib\net45\Microsoft.VisualStudio.RemoteControl.dll + + ..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Interop.1.16.30\lib\net35\Microsoft.VisualStudio.Setup.Configuration.Interop.dll + True + ..\..\packages\Microsoft.VisualStudio.Utilities.Internal.14.0.75-master5839BBFB\lib\net45\Microsoft.VisualStudio.Utilities.Internal.dll @@ -81,9 +82,8 @@ ..\..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - - ..\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - True + + ..\..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll @@ -101,6 +101,7 @@ ..\..\packages\System.Composition.TypedParts.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll + ..\..\packages\System.Console.4.3.0\lib\net46\System.Console.dll @@ -121,6 +122,7 @@ ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + ..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll @@ -128,6 +130,8 @@ ..\..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll True + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll @@ -143,12 +147,17 @@ ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll + + ..\..\packages\System.Threading.Tasks.Dataflow.4.5.24\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll + ..\..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll + + diff --git a/src/MessagePack.CodeGenerator/packages.config b/src/MessagePack.CodeGenerator/packages.config index d4a2c850b..4bf5abbe9 100644 --- a/src/MessagePack.CodeGenerator/packages.config +++ b/src/MessagePack.CodeGenerator/packages.config @@ -1,10 +1,10 @@  - + - - + + @@ -13,11 +13,12 @@ + - + @@ -54,6 +55,7 @@ + From 0939c12d349f8b0dbb91b1ad47840ea2ea7f81fe Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 7 Sep 2018 15:21:17 -0700 Subject: [PATCH 015/105] Add NuGet badge to README file Without this, it's "below the fold" of the first page to find where the nuget package actually is. This makes it much more discoverable. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e80583b35..5b32af8bf 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ MessagePack for C# (.NET, .NET Core, Unity, Xamarin) === [![AppVeyor](https://img.shields.io/appveyor/ci/neuecc/messagepack-csharp/master.svg?label=appveyor)](https://ci.appveyor.com/project/neuecc/messagepack-csharp/branch/master) [![Join the chat at https://gitter.im/MessagePack-CSharp/Lobby](https://badges.gitter.im/MessagePack-CSharp/Lobby.svg)](https://gitter.im/MessagePack-CSharp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Releases](https://img.shields.io/github/release/neuecc/MessagePack-CSharp.svg)](https://github.com/neuecc/MessagePack-CSharp/releases) +[![NuGet](https://img.shields.io/nuget/v/MessagePack.svg)](https://www.nuget.org/packages/messagepack) The extremely fast [MessagePack](http://msgpack.org/) serializer for C#. It is 10x faster than [MsgPack-Cli](https://github.com/msgpack/msgpack-cli) and outperforms other C# serializers. MessagePack for C# also ships with built-in support for LZ4 compression - an extremely fast compression algorithm. Performance is important, particularly in applications like game development, distributed computing, microservice architecture, and caching. From fc5b0acee253ab8786a8823dd24c375e2548a1a4 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 11 Dec 2018 20:05:55 -0800 Subject: [PATCH 016/105] Freshen up build authoring (#2) --- .gitignore | 3 +- Directory.Build.props | 30 ++ MessagePack.sln | 41 +-- README.md | 38 +-- azure-pipelines.yml | 17 + azure-pipelines/build.yml | 129 ++++++++ global.json | 5 + make_unity_symlink.bat | 15 +- {nuget => mpc_tools}/copy_mpc.bat | 0 {nuget => mpc_tools}/mpc_check.cs | 0 {nuget => mpc_tools}/try_mpc.bat | 0 nuget.config | 12 + .../MessagePack.AspNetCoreMvcFormatter.nuspec | 30 -- nuget/MessagePack.ImmutableCollection.nuspec | 46 --- nuget/MessagePack.LZ4.nuspec | 33 -- nuget/MessagePack.ReactiveProperty.nuspec | 46 --- nuget/MessagePack.UnityShims.nuspec | 42 --- nuget/MessagePack.nuspec | 51 --- nuget/MessagePackAnalyzer.nuspec | 21 -- nuget/build_libz.bat | 2 - nuget/nuget.exe | Bin 5059168 -> 0 bytes nuget/pack.bat | 6 - nuget/push.bat | 6 - .../DynamicCodeDumper.csproj | 52 +-- .../Properties/AssemblyInfo.cs | 37 --- sandbox/PerfBenchmarkDotNet/App.config | 42 --- .../PerfBenchmarkDotNet.csproj | 199 +---------- .../Properties/AssemblyInfo.cs | 36 -- sandbox/PerfBenchmarkDotNet/packages.config | 64 ---- .../PerfNetFramework/PerfNetFramework.csproj | 16 + .../Program.cs | 0 sandbox/PertNetFramework/App.config | 6 - .../PertNetFramework/PertNetFramework.csproj | 80 ----- .../Properties/AssemblyInfo.cs | 36 -- sandbox/PertNetFramework/packages.config | 10 - sandbox/Sandbox/Sandbox.csproj | 5 +- sandbox/SharedData/Properties/AssemblyInfo.cs | 36 -- sandbox/SharedData/SharedData.csproj | 60 +--- sandbox/TestData2/Properties/AssemblyInfo.cs | 36 -- sandbox/TestData2/TestData2.csproj | 62 +--- sandbox/TestData2/packages.config | 6 - .../Resources/Resource.Designer.cs | 8 +- src/Directory.Build.props | 7 + .../MessagePack.AspNetCoreMvcFormatter.csproj | 30 +- .../_AssemblyInfo.cs | 15 - src/MessagePack.CodeGenerator/App.config | 46 --- .../MessagePack.CodeGenerator.csproj | 218 +----------- src/MessagePack.CodeGenerator/Nuget.config | 13 - .../Properties/AssemblyInfo.cs | 36 -- src/MessagePack.CodeGenerator/packages.config | 67 ---- .../MessagePack.ImmutableCollection.csproj | 31 +- .../_AssemblyInfo.cs | 15 - .../MessagePack.ReactiveProperty.csproj | 38 +-- .../_AssemblyInfo.cs | 15 - ...tyClient.csproj => Assembly-CSharp.csproj} | 313 ++++++++---------- .../MessagePack.UnityClient.sln | 12 +- ...yAdsSettings.asset => PresetManager.asset} | Bin 4116 -> 4104 bytes .../ProjectSettings/ProjectVersion.txt | 2 +- .../UnityPackageManager/manifest.json | 4 - .../MessagePack.UnityShims.csproj | 36 +- src/MessagePack.UnityShims/_AssemblyInfo.cs | 15 - .../Formatters/CollectionFormatter.cs | 10 +- .../Formatters/DictionaryFormatter.cs | 4 +- .../DynamicObjectTypeFallbackFormatter.cs | 2 +- .../StandardClassLibraryFormatter.cs | 4 +- src/MessagePack/Formatters/TupleFormatter.cs | 2 +- .../Formatters/TypelessFormatter.cs | 2 +- .../Formatters/UnsafeBinaryFormatters.cs | 2 +- .../Formatters/ValueTupleFormatter.cs | 2 +- .../Internal/AsymmetricKeyHashTable.cs | 2 +- .../Internal/AutomataDictionary.cs | 10 +- src/MessagePack/Internal/ByteArrayComparer.cs | 10 +- .../Internal/ByteArrayStringHashTable.cs | 10 +- src/MessagePack/Internal/DynamicAssembly.cs | 8 +- src/MessagePack/Internal/FarmHash.cs | 2 +- src/MessagePack/Internal/GuidBits.cs | 4 +- .../Internal/ReflectionExtensions.cs | 2 +- .../Internal/ThreadsafeTypeKeyHashTable.cs | 4 +- src/MessagePack/Internal/UnsafeMemory.Low.cs | 2 +- src/MessagePack/Internal/UnsafeMemory.cs | 2 +- src/MessagePack/LZ4/Codec/LZ4Codec.Helper.cs | 2 +- .../LZ4/LZ4MessagePackSerializer.JSON.cs | 2 +- .../LZ4MessagePackSerializer.NonGeneric.cs | 2 +- .../LZ4/LZ4MessagePackSerializer.Typeless.cs | 2 +- src/MessagePack/MessagePack.csproj | 195 +++++------ src/MessagePack/MessagePackBinary.cs | 274 +++++++-------- src/MessagePack/MessagePackSerializer.Json.cs | 2 +- .../MessagePackSerializer.NonGeneric.cs | 2 +- .../MessagePackSerializer.Typeless.cs | 2 +- src/MessagePack/MessagePackSerializer.cs | 4 +- src/MessagePack/Resolvers/BuiltinResolver.cs | 2 +- .../ContractlessReflectionObjectResolver.cs | 2 +- .../Resolvers/DynamicEnumResolver.cs | 2 +- .../Resolvers/DynamicGenericResolver.cs | 6 +- .../Resolvers/DynamicObjectResolver.cs | 12 +- .../Resolvers/DynamicUnionResolver.cs | 4 +- .../Resolvers/PrimitiveObjectResolver.cs | 2 +- src/MessagePack/Resolvers/StandardResolver.cs | 18 +- .../TypelessContractlessStandardResolver.cs | 2 +- .../Resolvers/TypelessObjectResolver.cs | 2 +- .../Resolvers/UnsafeBinaryResolver.cs | 2 +- src/MessagePack/_AssemblyInfo.cs | 24 -- .../MessagePackAnalyzer.Vsix.csproj | 16 +- src/MessagePackAnalyzer.Vsix/app.config | 31 -- .../source.extension.vsixmanifest | 2 +- .../MessagePackAnalyzer.csproj | 121 ++----- .../Properties/AssemblyInfo.cs | 31 -- src/MessagePackAnalyzer/app.config | 31 -- src/MessagePackAnalyzer/packages.config | 20 -- .../MessagePack.Tests.csproj | 198 ++--------- .../Properties/AssemblyInfo.cs | 20 -- tests/MessagePack.Tests/app.config | 23 -- tests/MessagePack.Tests/packages.config | 22 -- version.json | 11 + 114 files changed, 874 insertions(+), 2578 deletions(-) create mode 100644 Directory.Build.props create mode 100644 azure-pipelines.yml create mode 100644 azure-pipelines/build.yml create mode 100644 global.json rename {nuget => mpc_tools}/copy_mpc.bat (100%) rename {nuget => mpc_tools}/mpc_check.cs (100%) rename {nuget => mpc_tools}/try_mpc.bat (100%) create mode 100644 nuget.config delete mode 100644 nuget/MessagePack.AspNetCoreMvcFormatter.nuspec delete mode 100644 nuget/MessagePack.ImmutableCollection.nuspec delete mode 100644 nuget/MessagePack.LZ4.nuspec delete mode 100644 nuget/MessagePack.ReactiveProperty.nuspec delete mode 100644 nuget/MessagePack.UnityShims.nuspec delete mode 100644 nuget/MessagePack.nuspec delete mode 100644 nuget/MessagePackAnalyzer.nuspec delete mode 100644 nuget/build_libz.bat delete mode 100644 nuget/nuget.exe delete mode 100644 nuget/pack.bat delete mode 100644 nuget/push.bat delete mode 100644 sandbox/DynamicCodeDumper/Properties/AssemblyInfo.cs delete mode 100644 sandbox/PerfBenchmarkDotNet/App.config delete mode 100644 sandbox/PerfBenchmarkDotNet/Properties/AssemblyInfo.cs delete mode 100644 sandbox/PerfBenchmarkDotNet/packages.config create mode 100644 sandbox/PerfNetFramework/PerfNetFramework.csproj rename sandbox/{PertNetFramework => PerfNetFramework}/Program.cs (100%) delete mode 100644 sandbox/PertNetFramework/App.config delete mode 100644 sandbox/PertNetFramework/PertNetFramework.csproj delete mode 100644 sandbox/PertNetFramework/Properties/AssemblyInfo.cs delete mode 100644 sandbox/PertNetFramework/packages.config delete mode 100644 sandbox/SharedData/Properties/AssemblyInfo.cs delete mode 100644 sandbox/TestData2/Properties/AssemblyInfo.cs delete mode 100644 sandbox/TestData2/packages.config create mode 100644 src/Directory.Build.props delete mode 100644 src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs delete mode 100644 src/MessagePack.CodeGenerator/App.config delete mode 100644 src/MessagePack.CodeGenerator/Nuget.config delete mode 100644 src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs delete mode 100644 src/MessagePack.CodeGenerator/packages.config delete mode 100644 src/MessagePack.ImmutableCollection/_AssemblyInfo.cs delete mode 100644 src/MessagePack.ReactiveProperty/_AssemblyInfo.cs rename src/MessagePack.UnityClient/{MessagePack.UnityClient.csproj => Assembly-CSharp.csproj} (73%) rename src/MessagePack.UnityClient/ProjectSettings/{UnityAdsSettings.asset => PresetManager.asset} (79%) delete mode 100644 src/MessagePack.UnityClient/UnityPackageManager/manifest.json delete mode 100644 src/MessagePack.UnityShims/_AssemblyInfo.cs delete mode 100644 src/MessagePack/_AssemblyInfo.cs delete mode 100644 src/MessagePackAnalyzer.Vsix/app.config delete mode 100644 src/MessagePackAnalyzer/Properties/AssemblyInfo.cs delete mode 100644 src/MessagePackAnalyzer/app.config delete mode 100644 src/MessagePackAnalyzer/packages.config delete mode 100644 tests/MessagePack.Tests/Properties/AssemblyInfo.cs delete mode 100644 tests/MessagePack.Tests/app.config delete mode 100644 tests/MessagePack.Tests/packages.config create mode 100644 version.json diff --git a/.gitignore b/.gitignore index 5983dad8d..78087f6a6 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,7 @@ artifacts/ *.tmp *.tmp_proj *.log +*.binlog *.vspscc *.vssscc .builds @@ -281,4 +282,4 @@ nuget/unity* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json -!.vscode/extensions.json \ No newline at end of file +!.vscode/extensions.json diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 000000000..250cd162a --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,30 @@ + + + Debug + $(MSBuildThisFileDirectory)obj\$(MSBuildProjectName)\ + $(MSBuildThisFileDirectory)bin\$(MSBuildProjectName)\ + + true + 7.3 + $(NoWarn);CS1591 + + false + false + LICENSE + neuecc + neuecc + © Yoshifumi Kawai. All rights reserved. + https://github.com/AArnott/MessagePack-CSharp + + true + true + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + + + + + + + + + diff --git a/MessagePack.sln b/MessagePack.sln index e1e49af13..33b22a886 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -9,51 +9,49 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack", "src\MessageP EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{19FE674A-AC94-4E7E-B24C-2285D1D04CDE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.Tests", "tests\MessagePack.Tests\MessagePack.Tests.csproj", "{9E1A55CA-711D-4F58-A332-735960E3434C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.Tests", "tests\MessagePack.Tests\MessagePack.Tests.csproj", "{9E1A55CA-711D-4F58-A332-735960E3434C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{344DC89D-8761-4552-A70A-B34DC19F39C4}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore + azure-pipelines.yml = azure-pipelines.yml + azure-pipelines\build.yml = azure-pipelines\build.yml + Directory.Build.props = Directory.Build.props + global.json = global.json LICENSE = LICENSE make_unity_symlink.bat = make_unity_symlink.bat - nuget\MessagePack.AspNetCoreMvcFormatter.nuspec = nuget\MessagePack.AspNetCoreMvcFormatter.nuspec - nuget\MessagePack.ImmutableCollection.nuspec = nuget\MessagePack.ImmutableCollection.nuspec - nuget\MessagePack.nuspec = nuget\MessagePack.nuspec - nuget\MessagePack.ReactiveProperty.nuspec = nuget\MessagePack.ReactiveProperty.nuspec - nuget\MessagePack.UnityShims.nuspec = nuget\MessagePack.UnityShims.nuspec - nuget\MessagePackAnalyzer.nuspec = nuget\MessagePackAnalyzer.nuspec - nuget\pack.bat = nuget\pack.bat - nuget\push.bat = nuget\push.bat + nuget.config = nuget.config README.md = README.md + version.json = version.json EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandbox", "sandbox", "{BF4C4202-5015-4FBD-80E6-D0F36A06F700}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.CodeGenerator", "src\MessagePack.CodeGenerator\MessagePack.CodeGenerator.csproj", "{D8B195AC-9E93-438E-8331-EF3A1F613D0B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.CodeGenerator", "src\MessagePack.CodeGenerator\MessagePack.CodeGenerator.csproj", "{D8B195AC-9E93-438E-8331-EF3A1F613D0B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicCodeDumper", "sandbox\DynamicCodeDumper\DynamicCodeDumper.csproj", "{8E511130-F838-4B47-842B-0FB27AD175B5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicCodeDumper", "sandbox\DynamicCodeDumper\DynamicCodeDumper.csproj", "{8E511130-F838-4B47-842B-0FB27AD175B5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedData", "sandbox\SharedData\SharedData.csproj", "{3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharedData", "sandbox\SharedData\SharedData.csproj", "{3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UnityShims", "src\MessagePack.UnityShims\MessagePack.UnityShims.csproj", "{C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.UnityShims", "src\MessagePack.UnityShims\MessagePack.UnityShims.csproj", "{C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.ReactiveProperty", "src\MessagePack.ReactiveProperty\MessagePack.ReactiveProperty.csproj", "{166A16C0-B89F-41AF-956A-235C6CA62C25}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.ReactiveProperty", "src\MessagePack.ReactiveProperty\MessagePack.ReactiveProperty.csproj", "{166A16C0-B89F-41AF-956A-235C6CA62C25}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.ImmutableCollection", "src\MessagePack.ImmutableCollection\MessagePack.ImmutableCollection.csproj", "{E066F547-7261-4561-AEFC-E64DBFD874F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePackAnalyzer", "src\MessagePackAnalyzer\MessagePackAnalyzer.csproj", "{2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePackAnalyzer", "src\MessagePackAnalyzer\MessagePackAnalyzer.csproj", "{2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePackAnalyzer.Vsix", "src\MessagePackAnalyzer.Vsix\MessagePackAnalyzer.Vsix.csproj", "{09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PertNetFramework", "sandbox\PertNetFramework\PertNetFramework.csproj", "{014A3DCE-50A6-4774-A4C1-C66EEAB67133}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerfNetFramework", "sandbox\PerfNetFramework\PerfNetFramework.csproj", "{014A3DCE-50A6-4774-A4C1-C66EEAB67133}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.AspNetCoreMvcFormatter", "src\MessagePack.AspNetCoreMvcFormatter\MessagePack.AspNetCoreMvcFormatter.csproj", "{17831017-C29C-4A48-B159-849BCE5079FB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.AspNetCoreMvcFormatter", "src\MessagePack.AspNetCoreMvcFormatter\MessagePack.AspNetCoreMvcFormatter.csproj", "{17831017-C29C-4A48-B159-849BCE5079FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerfBenchmarkDotNet", "sandbox\PerfBenchmarkDotNet\PerfBenchmarkDotNet.csproj", "{814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerfBenchmarkDotNet", "sandbox\PerfBenchmarkDotNet\PerfBenchmarkDotNet.csproj", "{814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestData2", "sandbox\TestData2\TestData2.csproj", "{2A32A538-BA26-4D89-85D0-E4249AFA0837}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestData2", "sandbox\TestData2\TestData2.csproj", "{2A32A538-BA26-4D89-85D0-E4249AFA0837}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -266,4 +264,7 @@ Global {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {2A32A538-BA26-4D89-85D0-E4249AFA0837} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B3911209-2DBF-47F8-98F6-BBC0EDFE63DE} + EndGlobalSection EndGlobal diff --git a/README.md b/README.md index e80583b35..81317af7d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ MessagePack for C# (.NET, .NET Core, Unity, Xamarin) === -[![AppVeyor](https://img.shields.io/appveyor/ci/neuecc/messagepack-csharp/master.svg?label=appveyor)](https://ci.appveyor.com/project/neuecc/messagepack-csharp/branch/master) -[![Join the chat at https://gitter.im/MessagePack-CSharp/Lobby](https://badges.gitter.im/MessagePack-CSharp/Lobby.svg)](https://gitter.im/MessagePack-CSharp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Releases](https://img.shields.io/github/release/neuecc/MessagePack-CSharp.svg)](https://github.com/neuecc/MessagePack-CSharp/releases) + +[![Build Status](https://dev.azure.com/andrewarnott/OSS/_apis/build/status/MessagePack)](https://dev.azure.com/andrewarnott/OSS/_build/latest?definitionId=24) The extremely fast [MessagePack](http://msgpack.org/) serializer for C#. It is 10x faster than [MsgPack-Cli](https://github.com/msgpack/msgpack-cli) and outperforms other C# serializers. MessagePack for C# also ships with built-in support for LZ4 compression - an extremely fast compression algorithm. Performance is important, particularly in applications like game development, distributed computing, microservice architecture, and caching. @@ -96,7 +96,7 @@ If you want to allow a specific type (for example, when registering a custom typ ![image](https://cloud.githubusercontent.com/assets/46207/23837427/8a8d507c-07cb-11e7-9277-5a566eb0bfde.png) -This is a sample of the contents of MessagePackAnalyzer.json. +This is a sample of the contents of MessagePackAnalyzer.json. ``` [ "MyNamespace.FooClass", "MyNameSpace.BarStruct" ] @@ -500,7 +500,7 @@ MessagePack.Formatters.TypelessFormatter.BindToType = typeName => { typeName = typeName.Replace("SomeNamespace", "AnotherNamespace"); } - + return Type.GetType(typeName, false); }; ``` @@ -669,7 +669,7 @@ using (var ms = new MemoryStream()) protobuf(-net) can not handle null and empty collection correctly. Because protobuf has no `null` representation( [this](http://stackoverflow.com/questions/21631428/protobuf-net-deserializes-empty-collection-to-null-when-the-collection-is-a-prop) is the protobuf-net authors answer). -[MessagePack specification](https://github.com/msgpack/msgpack/blob/master/spec.md) can completely serialize C# type system. This is the reason to recommend MessagePack over protobuf. +[MessagePack specification](https://github.com/msgpack/msgpack/blob/master/spec.md) can completely serialize C# type system. This is the reason to recommend MessagePack over protobuf. Protocol Buffers has good IDL and [gRPC](http://www.grpc.io/), that is a much good point than MessagePack. If you want to use IDL, I recommend [Google.Protobuf](https://github.com/google/protobuf/tree/master/csharp/src/Google.Protobuf) than MessagePack. @@ -738,7 +738,7 @@ Author is creating other extension packages, too. You can make your own extension serializers or integrate with framework, let's create them and share it! * [MessagePack.FSharpExtensions](https://github.com/pocketberserker/MessagePack.FSharpExtensions) - supports F# list,set,map,unit,option,discriminated union -* [MessagePack.NodaTime](https://github.com/ARKlab/MessagePack) - +* [MessagePack.NodaTime](https://github.com/ARKlab/MessagePack) - Support for NodaTime types to MessagePack C# * [WebApiContrib.Core.Formatter.MessagePack](https://github.com/WebApiContrib/WebAPIContrib.Core#formatters) - supports ASP.NET Core MVC([details in blog post](https://www.strathweb.com/2017/06/using-messagepack-with-asp-net-core-mvc/)) * [MessagePack.MediaTypeFormatter](https://github.com/sketch7/MessagePack.MediaTypeFormatter) - MessagePack MediaTypeFormatter @@ -824,7 +824,7 @@ Primitive API(MessagePackBinary) | --- | --- | | ReadNext | Skip MessagePackFormat binary block, returns read size. | | ReadNextBlock | Skip MessagePackFormat binary block with sub structures(array/map), returns read size. This is useful for create deserializer. | -| ReadMessageBlockFromStreamUnsafe | Read binary block from Stream, if readOnlySingleMessage = false then read sub structures(array/map). | +| ReadMessageBlockFromStreamUnsafe | Read binary block from Stream, if readOnlySingleMessage = false then read sub structures(array/map). | | ReadStringSegment | Read string format but do not decode UTF8, returns `ArraySegment`. | | ReadBytesSegment | Read binary format but do not copy bytes, returns `ArraySegment`. | | Write/ReadMapHeader | Write/Read map format header(element length). | @@ -937,7 +937,7 @@ public class CustomCompositeResolver : IFormatterResolver ReactivePropertyResolver.Instance, MessagePack.Unity.Extension.UnityBlitResolver.Instance, MessagePack.Unity.UnityResolver.Instance, - + // finaly use standard resolver StandardResolver.Instance }; @@ -1104,7 +1104,7 @@ IgnoreFormatter ```csharp // CompositeResolver can set custom formatter. MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault( - new IMessagePackFormatter[] + new IMessagePackFormatter[] { // for example, register reflection infos(can not serialize in default) new IgnoreFormatter(), @@ -1112,7 +1112,7 @@ MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault( new IgnoreFormatter(), new IgnoreFormatter() }, - new IFormatterResolver[] + new IFormatterResolver[] { ContractlessStandardResolver.Instance }); @@ -1256,15 +1256,15 @@ Unity Project is using symbolic link. At first, run `make_unity_symlink.bat` so Author Info --- -Yoshifumi Kawai(a.k.a. neuecc) is a software developer in Japan. -He is the Director/CTO at Grani, Inc. -Grani is a mobile game developer company in Japan and well known for using C#. -He is awarding Microsoft MVP for Visual C# since 2011. -He is known as the creator of [UniRx](http://github.com/neuecc/UniRx/)(Reactive Extensions for Unity) - -Blog: [https://medium.com/@neuecc](https://medium.com/@neuecc) (English) -Blog: [http://neue.cc/](http://neue.cc/) (Japanese) -Twitter: [https://twitter.com/neuecc](https://twitter.com/neuecc) (Japanese) +Yoshifumi Kawai(a.k.a. neuecc) is a software developer in Japan. +He is the Director/CTO at Grani, Inc. +Grani is a mobile game developer company in Japan and well known for using C#. +He is awarding Microsoft MVP for Visual C# since 2011. +He is known as the creator of [UniRx](http://github.com/neuecc/UniRx/)(Reactive Extensions for Unity) + +Blog: [https://medium.com/@neuecc](https://medium.com/@neuecc) (English) +Blog: [http://neue.cc/](http://neue.cc/) (Japanese) +Twitter: [https://twitter.com/neuecc](https://twitter.com/neuecc) (Japanese) License --- diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..9f9cee002 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,17 @@ +trigger: + branches: + include: ["master"] + paths: + exclude: ["doc", "*.md"] + +variables: + TreatWarningsAsErrors: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + BuildConfiguration: Release + BuildPlatform: Any CPU + +jobs: +- job: Windows + pool: Hosted VS2017 + steps: + - template: azure-pipelines/build.yml diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml new file mode 100644 index 000000000..ba65a7457 --- /dev/null +++ b/azure-pipelines/build.yml @@ -0,0 +1,129 @@ +steps: +- task: DotNetCoreInstaller@0 + displayName: Install .NET Core SDK 2.1.500 + inputs: + packageType: sdk + version: 2.1.500 +- script: dotnet --info + displayName: Show dotnet SDK info + +- script: | + dotnet tool install --tool-path . nbgv + .\nbgv cloud -p src + displayName: Set build number + condition: ne(variables['system.pullrequest.isfork'], true) +- task: PowerShell@2 + displayName: Set VSTS variables + inputs: + targetType: inline + script: | + if ($env:SignType -eq 'Real') { + $feedGuid = '09d8d03c-1ac8-456e-9274-4d2364527d99' + } else { + $feedGuid = 'da484c78-f942-44ef-b197-99e2a1bef53c' + } + + Write-Host "##vso[task.setvariable variable=feedGuid]$feedGuid" + + if ($env:ComputerName.StartsWith('factoryvm', [StringComparison]::OrdinalIgnoreCase)) { + Write-Host "Running on hosted queue" + Write-Host "##vso[task.setvariable variable=Hosted]true" + } + + if ($env:SYSTEM_COLLECTIONID -eq '011b8bdf-6d56-4f87-be0d-0092136884d9') { + Write-Host "Running on official devdiv account: $env:System_TeamFoundationCollectionUri" + } else { + Write-Host "Running under OSS account: $env:System_TeamFoundationCollectionUri" + } + +- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}: + - template: azure-pipeline.microbuild.before.yml + +- task: DotNetCoreCLI@2 + displayName: Restore + inputs: + command: restore + verbosityRestore: normal # detailed, normal, minimal + projects: '**\*.sln' + feedsToUse: config + nugetConfigPath: nuget.config + +# Use VSBuild to pack because `dotnet pack` can't sign packages with MicroBuild. +- task: VSBuild@1 + inputs: + vsVersion: 15.0 + solution: MessagePack.sln + msbuildArgs: /t:build,pack /m /v:m /bl:"$(Build.ArtifactStagingDirectory)/build_logs/msbuild.binlog" + platform: $(BuildPlatform) + configuration: $(BuildConfiguration) + displayName: Build MessagePack.sln + +- task: DotNetCoreCLI@2 + displayName: Run tests + inputs: + command: test + projects: tests/**/*.Tests.csproj + arguments: --configuration $(BuildConfiguration) --no-build -v n + +- task: VSBuild@1 + inputs: + vsVersion: 15.0 + solution: src\MessagePack.UnityClient\MessagePack.UnityClient.sln + msbuildArgs: /t:build /m /v:m /bl:"$(Build.ArtifactStagingDirectory)/build_logs/msbuild.unity.binlog" + platform: $(BuildPlatform) + configuration: $(BuildConfiguration) + displayName: Build MessagePack.UnityClient.sln + enabled: false # The build fails till the solution is opened in Unity, after which HintPaths are machine-specific + +- task: CopyFiles@1 + inputs: + Contents: | + obj/**/project.assets.json + TargetFolder: $(Build.ArtifactStagingDirectory)/projectAssetsJson + displayName: Collecting project.assets.json artifacts + condition: succeededOrFailed() + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/projectAssetsJson + ArtifactName: projectAssetsJson + ArtifactType: Container + displayName: Publish projectAssetsJson artifacts + condition: and(succeededOrFailed(), ne(variables['system.pullrequest.isfork'], true)) + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/build_logs + ArtifactName: build_logs + ArtifactType: Container + displayName: Publish build_logs artifacts + condition: and(succeededOrFailed(), ne(variables['system.pullrequest.isfork'], true)) + +## The rest of these steps are for deployment and skipped for PR builds + +#- task: PublishBuildArtifacts@1 +# inputs: +# PathtoPublish: $(build.sourcesdirectory)/bin +# ArtifactName: bin +# ArtifactType: Container +# condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), ne(variables['system.pullrequest.isfork'], true)) + +- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}: + - template: azure-pipeline.microbuild.after.yml + +- task: CopyFiles@1 + inputs: + Contents: | + bin/**/$(BuildConfiguration)/**/*.nupkg + bin/**/$(BuildConfiguration)/**/*.vsix + TargetFolder: $(Build.ArtifactStagingDirectory)/deployables + flattenFolders: true + displayName: Collecting deployables + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/deployables + ArtifactName: deployables + ArtifactType: Container + displayName: Publish deployables artifacts + condition: and(succeededOrFailed(), ne(variables['system.pullrequest.isfork'], true)) diff --git a/global.json b/global.json new file mode 100644 index 000000000..b62f6cc57 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "2.1.500" + } +} diff --git a/make_unity_symlink.bat b/make_unity_symlink.bat index a96764438..82c1a436f 100644 --- a/make_unity_symlink.bat +++ b/make_unity_symlink.bat @@ -1,4 +1,14 @@ -cd /d %~dp0 +:: Generally this script isn't necessary, since git records the symlinks. +:: But when creating new links, one could update this script, or just create the sym link and record it in git. + +pushd %~dp0 + +:: Create the directories within which links will be created +md src\MessagePack.UnityClient\Assets\Scripts\MessagePack\LZ4 +md src\MessagePack.UnityClient\Assets\Scripts\MessagePack\Unity +md src\MessagePack.UnityClient\Assets\Scripts\MessagePack\UnsafeExtensions + +:: Create the links and junctions themselves mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\Attributes.cs" "..\..\..\..\MessagePack\Attributes.cs" mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\FloatBits.cs" "..\..\..\..\MessagePack\FloatBits.cs" mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\IFormatterResolver.cs" "..\..\..\..\MessagePack\IFormatterResolver.cs" @@ -21,4 +31,5 @@ mklink ".\src\MessagePack.UnityClient\Assets\Scripts\Tests\Class1.cs" "..\..\..\ mklink /D ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\LZ4\Codec" "..\..\..\..\..\MessagePack\LZ4\Codec" mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\LZ4\LZ4MessagePackSerializer.cs" "..\..\..\..\..\MessagePack\LZ4\LZ4MessagePackSerializer.cs" mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\LZ4\LZ4MessagePackSerializer.JSON.cs" "..\..\..\..\..\MessagePack\LZ4\LZ4MessagePackSerializer.JSON.cs" -mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\LZ4\LZ4MessagePackSerializer.NonGeneric.cs" "..\..\..\..\..\MessagePack\LZ4\LZ4MessagePackSerializer.NonGeneric.cs" \ No newline at end of file +mklink ".\src\MessagePack.UnityClient\Assets\Scripts\MessagePack\LZ4\LZ4MessagePackSerializer.NonGeneric.cs" "..\..\..\..\..\MessagePack\LZ4\LZ4MessagePackSerializer.NonGeneric.cs" +popd diff --git a/nuget/copy_mpc.bat b/mpc_tools/copy_mpc.bat similarity index 100% rename from nuget/copy_mpc.bat rename to mpc_tools/copy_mpc.bat diff --git a/nuget/mpc_check.cs b/mpc_tools/mpc_check.cs similarity index 100% rename from nuget/mpc_check.cs rename to mpc_tools/mpc_check.cs diff --git a/nuget/try_mpc.bat b/mpc_tools/try_mpc.bat similarity index 100% rename from nuget/try_mpc.bat rename to mpc_tools/try_mpc.bat diff --git a/nuget.config b/nuget.config new file mode 100644 index 000000000..5a758dc71 --- /dev/null +++ b/nuget.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec b/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec deleted file mode 100644 index 2afefe27f..000000000 --- a/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec +++ /dev/null @@ -1,30 +0,0 @@ - - - - MessagePack.AspNetCoreMvcFormatter - 1.7.3.4 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - ASP.NET Core MVC Input/Output MessagePack formatter. - MsgPack, MessagePack, Serialization, Formatter, Serializer, aspnetcore, aspnetcoremvc - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePack.ImmutableCollection.nuspec b/nuget/MessagePack.ImmutableCollection.nuspec deleted file mode 100644 index 8fc124f24..000000000 --- a/nuget/MessagePack.ImmutableCollection.nuspec +++ /dev/null @@ -1,46 +0,0 @@ - - - - MessagePack.ImmutableCollection - 1.7.3.4 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). Extension support for System.Collections.Immutable. - MsgPack, MessagePack, Serialization, Formatter, Serializer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePack.LZ4.nuspec b/nuget/MessagePack.LZ4.nuspec deleted file mode 100644 index 18455efa7..000000000 --- a/nuget/MessagePack.LZ4.nuspec +++ /dev/null @@ -1,33 +0,0 @@ - - - - MessagePack.LZ4 - 0.8.2 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity), LZ4 Compression Support. - Initial LZ4 Extension. - MsgPack, MessagePack, Serialization, Formatter, Serializer, LZ4, Compression - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePack.ReactiveProperty.nuspec b/nuget/MessagePack.ReactiveProperty.nuspec deleted file mode 100644 index 50b1a5f45..000000000 --- a/nuget/MessagePack.ReactiveProperty.nuspec +++ /dev/null @@ -1,46 +0,0 @@ - - - - MessagePack.ReactiveProperty - 1.7.3.4 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). Extension support for ReactiveProperty. - MsgPack, MessagePack, Serialization, Formatter, Serializer, ReactiveProperty - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePack.UnityShims.nuspec b/nuget/MessagePack.UnityShims.nuspec deleted file mode 100644 index 648e5d8ce..000000000 --- a/nuget/MessagePack.UnityShims.nuspec +++ /dev/null @@ -1,42 +0,0 @@ - - - - MessagePack.UnityShims - 1.7.3.4 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). Extension support for Unity. - MsgPack, MessagePack, Serialization, Formatter, Serializer, ReactiveProperty - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePack.nuspec b/nuget/MessagePack.nuspec deleted file mode 100644 index f692cb739..000000000 --- a/nuget/MessagePack.nuspec +++ /dev/null @@ -1,51 +0,0 @@ - - - - MessagePack - 1.7.3.4 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Extremely Fast MessagePack(MsgPack) Serializer for C#(.NET, .NET Core, Unity, Xamarin). - MsgPack, MessagePack, Serialization, Formatter, Serializer, Unity, Xamarin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePackAnalyzer.nuspec b/nuget/MessagePackAnalyzer.nuspec deleted file mode 100644 index b2038d6f1..000000000 --- a/nuget/MessagePackAnalyzer.nuspec +++ /dev/null @@ -1,21 +0,0 @@ - - - - MessagePackAnalyzer - 1.6.1 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Analyzer of MessagePack for C#, verify rule for [MessagePackObject] and code fix for [Key]. - MsgPack, MessagePack, Serialization, Formatter, Analyzer - - - - - - - - - \ No newline at end of file diff --git a/nuget/build_libz.bat b/nuget/build_libz.bat deleted file mode 100644 index fb2142fc8..000000000 --- a/nuget/build_libz.bat +++ /dev/null @@ -1,2 +0,0 @@ -REM not working? -REM libz inject-dll --assembly .\tools\mpc.exe --include .\tools\*.dll --move \ No newline at end of file diff --git a/nuget/nuget.exe b/nuget/nuget.exe deleted file mode 100644 index a34c36752a4c809be2eacaea88ca0c2b2fd7593d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5059168 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�WvGYPilK)=Id#FfXw7azpkx? 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

MWQQpJ;X3spS1K&Rr# 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�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

$-m&wooPjPIpzp=5AoZ5aGz^b_ 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 z

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

#CC2M5`C#es(qit&EH_9V;( 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Υ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

    FbAVpAu0|nL=Jqhzy62jIzEsx6T3nvH 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�o)$cYKhfqx?e>8lNP3dk8D?qn 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 z

    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

    )3=fL$ktb4}K1z;i*faXmOp}P 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%0DdbC#Aay_ekTpa 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 D{>1Ww diff --git a/nuget/pack.bat b/nuget/pack.bat deleted file mode 100644 index 1d6c5a75e..000000000 --- a/nuget/pack.bat +++ /dev/null @@ -1,6 +0,0 @@ -nuget pack MessagePack.nuspec -nuget pack MessagePack.ImmutableCollection.nuspec -nuget pack MessagePack.ReactiveProperty.nuspec -nuget pack MessagePack.UnityShims.nuspec -nuget pack MessagePack.AspNetCoreMvcFormatter.nuspec -nuget pack MessagePackAnalyzer.nuspec \ No newline at end of file diff --git a/nuget/push.bat b/nuget/push.bat deleted file mode 100644 index f3f2d3f3a..000000000 --- a/nuget/push.bat +++ /dev/null @@ -1,6 +0,0 @@ -nuget push MessagePack.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.ImmutableCollection.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.ReactiveProperty.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.UnityShims.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.AspNetCoreMvcFormatter.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -REM nuget push MessagePackAnalyzer.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package diff --git a/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj b/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj index 667c8b4ed..e36ad5ee6 100644 --- a/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj +++ b/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj @@ -1,51 +1,8 @@ - - - + - Debug - AnyCPU - {8E511130-F838-4B47-842B-0FB27AD175B5} - Exe - Properties - DynamicCodeDumper - DynamicCodeDumper - v4.6.1 - 512 - - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET_35;NETSTANDARD1_4 - prompt - 4 - false - true - - - pdbonly - true - bin\Release\ - TRACE;NET_35, NETSTANDARD1_4 - prompt - 4 - false + net461 true - - - - - - - - - - - - Code\Attributes.cs @@ -119,8 +76,5 @@ Class1.cs - - - - \ No newline at end of file + diff --git a/sandbox/DynamicCodeDumper/Properties/AssemblyInfo.cs b/sandbox/DynamicCodeDumper/Properties/AssemblyInfo.cs deleted file mode 100644 index cc8f8bc11..000000000 --- a/sandbox/DynamicCodeDumper/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("DynamicCodeDumper")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DynamicCodeDumper")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("8e511130-f838-4b47-842b-0fb27ad175b5")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 以下のように '*' を使用します: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - diff --git a/sandbox/PerfBenchmarkDotNet/App.config b/sandbox/PerfBenchmarkDotNet/App.config deleted file mode 100644 index 0fc17b8c4..000000000 --- a/sandbox/PerfBenchmarkDotNet/App.config +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sandbox/PerfBenchmarkDotNet/PerfBenchmarkDotNet.csproj b/sandbox/PerfBenchmarkDotNet/PerfBenchmarkDotNet.csproj index 67c905d3e..7601d4f45 100644 --- a/sandbox/PerfBenchmarkDotNet/PerfBenchmarkDotNet.csproj +++ b/sandbox/PerfBenchmarkDotNet/PerfBenchmarkDotNet.csproj @@ -1,187 +1,34 @@ - - - + - Debug - AnyCPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B} Exe PerfBenchmarkDotNet PerfBenchmarkDotNet - v4.6.1 - 512 + net461 true - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE;ENABLE_UNSAFE_MSGPACK - prompt - 4 - true - true - - ..\..\packages\BenchmarkDotNet.0.10.8\lib\net46\BenchmarkDotNet.dll - - - ..\..\packages\BenchmarkDotNet.Core.0.10.8\lib\net46\BenchmarkDotNet.Core.dll - - - ..\..\packages\BenchmarkDotNet.Diagnostics.Windows.0.10.8\lib\net46\BenchmarkDotNet.Diagnostics.Windows.dll - - - ..\..\packages\BenchmarkDotNet.Toolchains.Roslyn.0.10.8\lib\net46\BenchmarkDotNet.Toolchains.Roslyn.dll - - - ..\..\packages\Hyperion.0.9.6\lib\net45\Hyperion.dll - - - ..\..\packages\Jil.2.15.4\lib\net45\Jil.dll - False .\MessagePack_1_6_0_3.dll oldmsgpack - - ..\..\packages\Microsoft.CodeAnalysis.Common.2.0.0\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - - - ..\..\packages\Microsoft.Diagnostics.Tracing.TraceEvent.1.0.41\lib\net40\Microsoft.Diagnostics.Tracing.TraceEvent.dll - - - ..\..\packages\Microsoft.DotNet.InternalAbstractions.1.0.0\lib\net451\Microsoft.DotNet.InternalAbstractions.dll - - - ..\..\packages\Microsoft.DotNet.PlatformAbstractions.1.1.1\lib\net451\Microsoft.DotNet.PlatformAbstractions.dll - - - ..\..\packages\Microsoft.Win32.Registry.4.3.0\lib\net46\Microsoft.Win32.Registry.dll - - - ..\..\packages\MsgPack.Cli.0.9.0-rc1\lib\net46\MsgPack.dll - - - ..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - ..\..\packages\protobuf-net.2.3.2\lib\net40\protobuf-net.dll - - - ..\..\packages\Sigil.4.7.0\lib\net45\Sigil.dll - - - - ..\..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - - - ..\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - True - - - - ..\..\packages\System.Console.4.3.0\lib\net46\System.Console.dll - - - - ..\..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - - - ..\..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll - - - ..\..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - - - ..\..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - - - ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - - - - ..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll - - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - - - ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll - - - ..\..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - - - - ..\..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll - - - ..\..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll - - - ..\..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll - - - ..\..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll - - - ..\..\packages\ZeroFormatter.1.6.4\lib\net45\ZeroFormatter.dll - - - ..\..\packages\ZeroFormatter.Interfaces.1.6.4\lib\net45\ZeroFormatter.Interfaces.dll - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -189,17 +36,7 @@ - {7abb33ee-a2f1-492b-8daf-5df89f0f0b79} - MessagePack newmsgpack - - - - - このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。 - - - - \ No newline at end of file + diff --git a/sandbox/PerfBenchmarkDotNet/Properties/AssemblyInfo.cs b/sandbox/PerfBenchmarkDotNet/Properties/AssemblyInfo.cs deleted file mode 100644 index d2cee96b3..000000000 --- a/sandbox/PerfBenchmarkDotNet/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("PerfBenchmarkDotNet")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PerfBenchmarkDotNet")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("814f94d6-1413-4acb-b1b5-a3488caa1e6b")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 既定値にすることができます: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/sandbox/PerfBenchmarkDotNet/packages.config b/sandbox/PerfBenchmarkDotNet/packages.config deleted file mode 100644 index dc0100507..000000000 --- a/sandbox/PerfBenchmarkDotNet/packages.config +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sandbox/PerfNetFramework/PerfNetFramework.csproj b/sandbox/PerfNetFramework/PerfNetFramework.csproj new file mode 100644 index 000000000..eb2a0e472 --- /dev/null +++ b/sandbox/PerfNetFramework/PerfNetFramework.csproj @@ -0,0 +1,16 @@ + + + Exe + net461 + true + + + + + + + + + + + diff --git a/sandbox/PertNetFramework/Program.cs b/sandbox/PerfNetFramework/Program.cs similarity index 100% rename from sandbox/PertNetFramework/Program.cs rename to sandbox/PerfNetFramework/Program.cs diff --git a/sandbox/PertNetFramework/App.config b/sandbox/PertNetFramework/App.config deleted file mode 100644 index 731f6de6c..000000000 --- a/sandbox/PertNetFramework/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/sandbox/PertNetFramework/PertNetFramework.csproj b/sandbox/PertNetFramework/PertNetFramework.csproj deleted file mode 100644 index 36b320c44..000000000 --- a/sandbox/PertNetFramework/PertNetFramework.csproj +++ /dev/null @@ -1,80 +0,0 @@ - - - - - Debug - AnyCPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133} - Exe - PertNetFramework - PertNetFramework - v4.6.1 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\MsgPack.Cli.0.9.0-beta2\lib\net46\MsgPack.dll - - - ..\..\packages\Newtonsoft.Json.10.0.1-beta1\lib\net45\Newtonsoft.Json.dll - - - ..\..\packages\protobuf-net.2.1.0\lib\net451\protobuf-net.dll - - - - - ..\..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - - - - ..\..\packages\ZeroFormatter.1.6.4\lib\net45\ZeroFormatter.dll - - - ..\..\packages\ZeroFormatter.Interfaces.1.6.4\lib\net45\ZeroFormatter.Interfaces.dll - - - - - - - - - - - - - {7abb33ee-a2f1-492b-8daf-5df89f0f0b79} - MessagePack - - - - \ No newline at end of file diff --git a/sandbox/PertNetFramework/Properties/AssemblyInfo.cs b/sandbox/PertNetFramework/Properties/AssemblyInfo.cs deleted file mode 100644 index b97a5d254..000000000 --- a/sandbox/PertNetFramework/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("PertNetFramework")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PertNetFramework")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("014a3dce-50a6-4774-a4c1-c66eeab67133")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 既定値にすることができます: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/sandbox/PertNetFramework/packages.config b/sandbox/PertNetFramework/packages.config deleted file mode 100644 index 57581f217..000000000 --- a/sandbox/PertNetFramework/packages.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/sandbox/Sandbox/Sandbox.csproj b/sandbox/Sandbox/Sandbox.csproj index 0a6db9a29..dac06aa47 100644 --- a/sandbox/Sandbox/Sandbox.csproj +++ b/sandbox/Sandbox/Sandbox.csproj @@ -3,9 +3,6 @@ Exe netcoreapp2.0 - - - False True @@ -24,4 +21,4 @@ - \ No newline at end of file + diff --git a/sandbox/SharedData/Properties/AssemblyInfo.cs b/sandbox/SharedData/Properties/AssemblyInfo.cs deleted file mode 100644 index 80b6217c6..000000000 --- a/sandbox/SharedData/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("SharedData")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("SharedData")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("3abc5c4c-2ce4-459e-8666-f2b181c3def3")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 以下のように '*' を使用します: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/sandbox/SharedData/SharedData.csproj b/sandbox/SharedData/SharedData.csproj index 5f628a9bf..f994bcb58 100644 --- a/sandbox/SharedData/SharedData.csproj +++ b/sandbox/SharedData/SharedData.csproj @@ -1,60 +1,8 @@ - - - + - Debug - AnyCPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3} - Library - Properties - SharedData - SharedData - v4.6.1 - 512 - + netstandard1.6 - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - ..\..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - - - - - - - {7abb33ee-a2f1-492b-8daf-5df89f0f0b79} - MessagePack - + - - \ No newline at end of file + diff --git a/sandbox/TestData2/Properties/AssemblyInfo.cs b/sandbox/TestData2/Properties/AssemblyInfo.cs deleted file mode 100644 index 60eeea493..000000000 --- a/sandbox/TestData2/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("TestData2")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestData2")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("2a32a538-ba26-4d89-85d0-e4249afa0837")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 以下のように '*' を使用します: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/sandbox/TestData2/TestData2.csproj b/sandbox/TestData2/TestData2.csproj index 851ff55ee..893557f7d 100644 --- a/sandbox/TestData2/TestData2.csproj +++ b/sandbox/TestData2/TestData2.csproj @@ -1,60 +1,10 @@ - - - + - Debug - AnyCPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837} - Library - Properties - TestData2 - TestData2 - v4.6.1 - 512 + net461 - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\MessagePack.1.6.1\lib\net45\MessagePack.dll - - - - - ..\..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - - - - - - - - - + + + - - \ No newline at end of file + diff --git a/sandbox/TestData2/packages.config b/sandbox/TestData2/packages.config deleted file mode 100644 index f52c8f95d..000000000 --- a/sandbox/TestData2/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/sandbox/XamarinAndroid/Resources/Resource.Designer.cs b/sandbox/XamarinAndroid/Resources/Resource.Designer.cs index cda917703..d2a3d4603 100644 --- a/sandbox/XamarinAndroid/Resources/Resource.Designer.cs +++ b/sandbox/XamarinAndroid/Resources/Resource.Designer.cs @@ -1,11 +1,11 @@ #pragma warning disable 1591 //------------------------------------------------------------------------------ // -// このコードはツールによって生成されました。 -// ランタイム バージョン:4.0.30319.42000 +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // -// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、 -// コードが再生成されるときに損失したりします。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 000000000..6195b2bcb --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,7 @@ + + + + True + $(MSBuildThisFileDirectory)..\opensource.snk + + diff --git a/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj b/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj index bbf97fa58..0fc984b3e 100644 --- a/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj +++ b/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj @@ -1,22 +1,20 @@  - - netstandard1.6;netstandard2.0; - True - ..\..\opensource.snk - false - + + netstandard1.6;netstandard2.0; - - bin\Release\netstandard2.0\MessagePack.AspNetCoreMvcFormatter.xml - + true + Codestin Search App + ASP.NET Core MVC Input/Output MessagePack formatter. + MsgPack;MessagePack;Serialization;Formatter;Serializer;aspnetcore;aspnetcoremvc + - - - + + + - - - + + + - \ No newline at end of file + diff --git a/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs b/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs deleted file mode 100644 index 9f727b568..000000000 --- a/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MessagePack.AspNetCoreMvcFormatter")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("7c1f59ed-3929-4cbb-8aca-b13139fbca3a")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] diff --git a/src/MessagePack.CodeGenerator/App.config b/src/MessagePack.CodeGenerator/App.config deleted file mode 100644 index f276422ac..000000000 --- a/src/MessagePack.CodeGenerator/App.config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj index 5e300aa95..6bc31cd2f 100644 --- a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj +++ b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj @@ -1,223 +1,40 @@ - - - - + - Debug - AnyCPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B} Exe - MessagePack.CodeGenerator mpc - v4.6.1 - 512 + net461 true - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - ..\..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll - - - ..\..\packages\Microsoft.Build.Framework.15.8.166\lib\net46\Microsoft.Build.Framework.dll - - - ..\..\packages\Microsoft.Build.MSBuildLocator.1.0.1-preview-g6cd9a57801\lib\net46\Microsoft.Build.MSBuildLocator.dll - - - ..\..\packages\Microsoft.Build.Tasks.Core.15.8.166\lib\net46\Microsoft.Build.Tasks.Core.dll - - - ..\..\packages\Microsoft.Build.Utilities.Core.15.8.166\lib\net46\Microsoft.Build.Utilities.Core.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Common.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Elfie.0.10.6-rc2\lib\net46\Microsoft.CodeAnalysis.Elfie.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.6.1\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.6.1\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll - - - ..\..\packages\Microsoft.VisualStudio.RemoteControl.14.0.262-masterA5CACE98\lib\net45\Microsoft.VisualStudio.RemoteControl.dll - - - ..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Interop.1.16.30\lib\net35\Microsoft.VisualStudio.Setup.Configuration.Interop.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Utilities.Internal.14.0.75-master5839BBFB\lib\net45\Microsoft.VisualStudio.Utilities.Internal.dll - - - - ..\..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - - - ..\..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll - - - - ..\..\packages\System.Composition.AttributedModel.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll - - - ..\..\packages\System.Composition.Convention.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll - - - ..\..\packages\System.Composition.Hosting.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll - - - ..\..\packages\System.Composition.Runtime.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll - - - ..\..\packages\System.Composition.TypedParts.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - - - - ..\..\packages\System.Console.4.3.0\lib\net46\System.Console.dll - - - - ..\..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - - - ..\..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll - - - ..\..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - - - ..\..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - - - ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - - - - - ..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - ..\..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - - - - - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll - - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - - - ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll - - - ..\..\packages\System.Threading.Tasks.Dataflow.4.5.24\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll - - - ..\..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - - - - - - ..\..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll - - - ..\..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll - - - ..\..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll - - - ..\..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll - + + + + + + + - - - + UnionTemplate.tt True True - + True True EnumTemplate.tt - + True True FormatterTemplate.tt - - + True True ResolverTemplate.tt - - - - - - - - - - - - - - - - - @@ -237,11 +54,4 @@ ResolverTemplate.cs - - - - このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。 - - - - \ No newline at end of file + diff --git a/src/MessagePack.CodeGenerator/Nuget.config b/src/MessagePack.CodeGenerator/Nuget.config deleted file mode 100644 index 9edcbd195..000000000 --- a/src/MessagePack.CodeGenerator/Nuget.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs b/src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index 078a6efd6..000000000 --- a/src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("MessagePack.CodeGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MessagePack.CodeGenerator")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("d8b195ac-9e93-438e-8331-ef3a1f613d0b")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 既定値にすることができます: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0.0")] -[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/src/MessagePack.CodeGenerator/packages.config b/src/MessagePack.CodeGenerator/packages.config deleted file mode 100644 index 4bf5abbe9..000000000 --- a/src/MessagePack.CodeGenerator/packages.config +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj b/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj index 832d13ebc..0ab6a27c0 100644 --- a/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj +++ b/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj @@ -1,23 +1,20 @@  - - netstandard1.6;netstandard2.0;net45;net47 - True - ..\..\opensource.snk - false - + + netstandard1.6;netstandard2.0;net45;net47 - - bin\Release\netstandard2.0\MessagePack.ImmutableCollection.xml - 1701;1702;1705;1591 - + true + Codestin Search App + Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). Extension support for System.Collections.Immutable. + MsgPack;MessagePack;Serialization;Formatter;Serializer + - - - + + + - - - + + + - \ No newline at end of file + diff --git a/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs b/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs deleted file mode 100644 index 3c4c3199f..000000000 --- a/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MessagePack.ImmutableCollection")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("fe5a979e-24c6-47dd-919f-81df6fb2e160")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] diff --git a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj index ad8d2db1c..be0c4c445 100644 --- a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj +++ b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj @@ -2,14 +2,11 @@ netstandard1.6;netstandard2.0;net46;net47 - True - ..\..\opensource.snk - false - - - bin\Release\netstandard2.0\MessagePack.ReactiveProperty.xml - 1701;1702;1705;1591 + true + Codestin Search App + Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). Extension support for ReactiveProperty. + MsgPack;MessagePack;Serialization;Formatter;Serializer;ReactiveProperty @@ -19,34 +16,11 @@ + - - - 4.2.2 - - - - - - 4.2.2 - - - - - - 4.2.2 - - - - - - 4.2.2 - - - - \ No newline at end of file + diff --git a/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs b/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs deleted file mode 100644 index 38a2ba60c..000000000 --- a/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MessagePack.ReactiveProperty")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("16b0640a-c86d-4f21-bf2f-45efc728ae96")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] diff --git a/src/MessagePack.UnityClient/MessagePack.UnityClient.csproj b/src/MessagePack.UnityClient/Assembly-CSharp.csproj similarity index 73% rename from src/MessagePack.UnityClient/MessagePack.UnityClient.csproj rename to src/MessagePack.UnityClient/Assembly-CSharp.csproj index acee40816..92626c8ed 100644 --- a/src/MessagePack.UnityClient/MessagePack.UnityClient.csproj +++ b/src/MessagePack.UnityClient/Assembly-CSharp.csproj @@ -1,55 +1,159 @@  + + + 4 + Debug AnyCPU 10.0.20506 2.0 - {BB60E6A9-514B-4670-B176-DDDAB81A7468} + + + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA} Library + Properties Assembly-CSharp - 512 - {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - .NETFramework v3.5 - Unity Subset v3.5 - - Game:1 - StandaloneWindows64:19 - 2017.2.0f3 - - 4 + 512 + . + win + False + - pdbonly + true + full false - Temp\UnityVS_bin\Debug\ - Temp\UnityVS_obj\Debug\ + Temp\bin\Debug\ + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_1_6;UNITY_2018_1;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_PLAYMODE_TESTS_RUNNER;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;UNITY_TEAM_LICENSE;ENABLE_VSTU prompt 4 - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_2_0;UNITY_2017_2;UNITY_2017;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_GENERICS;ENABLE_PVR_GI;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_NATIVE_ARRAY;ENABLE_SPRITE_MASKING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_PLAYMODE_TESTS_RUNNER;ENABLE_VIDEO;ENABLE_RMGUI;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_STYLE_SHEETS;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_SPATIALTRACKING;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_NATIVE_ARRAY_CHECKS;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE; - true + 0169 + True pdbonly - false - Temp\UnityVS_bin\Release\ - Temp\UnityVS_obj\Release\ + true + Temp\bin\Release\ prompt 4 - TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_2_0;UNITY_2017_2;UNITY_2017;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_GENERICS;ENABLE_PVR_GI;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_NATIVE_ARRAY;ENABLE_SPRITE_MASKING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_PLAYMODE_TESTS_RUNNER;ENABLE_VIDEO;ENABLE_RMGUI;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_STYLE_SHEETS;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_SPATIALTRACKING;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_NATIVE_ARRAY_CHECKS;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE; - true + 0169 + True + + + true + true + false + false + false + + + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Unity/VSTU + Game:1 + StandaloneWindows64:19 + 2018.1.6f1 - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Library\UnityAssemblies\UnityEditor.dll @@ -220,146 +324,15 @@ Assets\Scripts\Tests\MsgPack\MsgPack.dll - - - - - - - - - - - - - True - True - ForceSizePrimitiveFormatter.tt - - - - - - - - True - True - PrimitiveFormatter.tt - - - - - True - True - TupleFormatter.tt - - - - - True - True - ValueTupleFormatter.tt - - - - - - - - - - - - - - - - - - True - True - UnsafeMemory.tt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TextTemplatingFileGenerator - ForceSizePrimitiveFormatter.cs - - - TextTemplatingFileGenerator - PrimitiveFormatter.cs - - - TextTemplatingFileGenerator - TupleFormatter.cs - - - TextTemplatingFileGenerator - ValueTupleFormatter.cs - - - TextTemplatingFileGenerator - UnsafeMemory.cs - - - - + + + + + + + + + diff --git a/src/MessagePack.UnityClient/MessagePack.UnityClient.sln b/src/MessagePack.UnityClient/MessagePack.UnityClient.sln index e9da49ace..536df589b 100644 --- a/src/MessagePack.UnityClient/MessagePack.UnityClient.sln +++ b/src/MessagePack.UnityClient/MessagePack.UnityClient.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2015 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UnityClient", "MessagePack.UnityClient.csproj", "{BB60E6A9-514B-4670-B176-DDDAB81A7468}" +# Visual Studio 15 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UnityClient", "Assembly-CSharp.csproj", "{57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,10 +9,10 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Release|Any CPU.Build.0 = Release|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/MessagePack.UnityClient/ProjectSettings/UnityAdsSettings.asset b/src/MessagePack.UnityClient/ProjectSettings/PresetManager.asset similarity index 79% rename from src/MessagePack.UnityClient/ProjectSettings/UnityAdsSettings.asset rename to src/MessagePack.UnityClient/ProjectSettings/PresetManager.asset index 2e33e9599607bcf1283f0f6695ac95f4acc1adc8..32989d0e135188496f685f98a9ed4ea6eb54c69e 100644 GIT binary patch literal 4104 zcmeH_yGlbr5Qb-S^?uhzL41K|EWCgOix3ozM6nM?J(_4DYL0@1u$@n!t&OCzQLL=& ztSxMP6p#PEdm_d+5O!eB%zQgLyZa|1@hOpk4iOndL=c&s$u4BFnYsO}e1&1C6xihS z{g#B`(O2{KF86%%@Rnb@YRZd&(_co;{!YWR;Thbef||WuKRhWb;HRj0Za1PmH`Vqoo}rdGKi&4O zUUK7U*~Cu1i#2t!JYjUZM$P&Ch|#;+=9?dKnS1R0Te=OhA4YzQ$oag>5Fw2Bxkr42 zlMlmb3a_O8EgeP-(}w@nVKm~UGr!>nMeo=<@Xw@P&inh`c`aD4HUf!q+hT}Kw=Yk8 z3HYg(H@u*F;ghW9QQAR!tV^YU0}IufT`GA&S6ov0JYW=BI!JXTRyMis!ZM!I1P*iGlB@#)LNSl;qy3kc#!52{6xYvb` z;?g(Kc+MnMM4v!r;LhCp&CSW=%qk*<8Ik2x5m~~DMP#d5uQrA?`AE}LDS!&5+n1;M zL-FM9b^Z9h^xi9%!CeIRIT|7f`cqRRE$T_v7nQ`jZP?Aj}IHOG zR|wW~Up&*tp3$Gj`j`F!`M!QJ7Y6#e<;7iJ>ma<0WpLI33fz8h@B7|C-_;kkS suBiO_CL4CO4p;}Q1J(iSfOWt+U>&dySO=^F)`9=!0RH{>OFa3gPohF&3jhEB diff --git a/src/MessagePack.UnityClient/ProjectSettings/ProjectVersion.txt b/src/MessagePack.UnityClient/ProjectSettings/ProjectVersion.txt index 7a6fffb8b..29eae9e06 100644 --- a/src/MessagePack.UnityClient/ProjectSettings/ProjectVersion.txt +++ b/src/MessagePack.UnityClient/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2017.2.0f3 +m_EditorVersion: 2018.1.6f1 diff --git a/src/MessagePack.UnityClient/UnityPackageManager/manifest.json b/src/MessagePack.UnityClient/UnityPackageManager/manifest.json deleted file mode 100644 index 526aca605..000000000 --- a/src/MessagePack.UnityClient/UnityPackageManager/manifest.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "dependencies": { - } -} diff --git a/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj b/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj index ad3609e1e..cdc0000cd 100644 --- a/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj +++ b/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj @@ -1,27 +1,19 @@  - - netstandard1.6;netstandard2.0;net45;net47 - MessagePack.Unity - True - ..\..\opensource.snk - false - + + netstandard1.6;netstandard2.0;net45;net47 + MessagePack.Unity + true + $(DefineConstants);ENABLE_UNSAFE_MSGPACK - - True - bin\Release\netstandard2.0\MessagePack.UnityShims.xml - 1701;1702;1705;1591 - TRACE;RELEASE;NETSTANDARD;ENABLE_UNSAFE_MSGPACK - + true + Codestin Search App + Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). Extension support for Unity. + MsgPack;MessagePack;Serialization;Formatter;Serializer;Unity + - - True - TRACE;DEBUG;NETSTANDARD;ENABLE_UNSAFE_MSGPACK; - + + + - - - - - \ No newline at end of file + diff --git a/src/MessagePack.UnityShims/_AssemblyInfo.cs b/src/MessagePack.UnityShims/_AssemblyInfo.cs deleted file mode 100644 index 1a5fa01e7..000000000 --- a/src/MessagePack.UnityShims/_AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MessagePack.UnityShims")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("4b074f49-f7cb-4885-9a58-cc75a7d64b62")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] diff --git a/src/MessagePack/Formatters/CollectionFormatter.cs b/src/MessagePack/Formatters/CollectionFormatter.cs index 870e94729..de17ec59e 100644 --- a/src/MessagePack/Formatters/CollectionFormatter.cs +++ b/src/MessagePack/Formatters/CollectionFormatter.cs @@ -4,7 +4,7 @@ using System.Collections.ObjectModel; using System.Linq; -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Collections.Concurrent; #endif @@ -235,7 +235,7 @@ public int Serialize(ref byte[] bytes, int offset, TCollection value, IFormatter { while (e.MoveNext()) { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK offset += formatter.Serialize(ref bytes, offset, e.Current, formatterResolver); #else offset += formatter.Serialize(ref bytes, (int)offset, (TElement)e.Current, (IFormatterResolver)formatterResolver); @@ -266,7 +266,7 @@ public int Serialize(ref byte[] bytes, int offset, TCollection value, IFormatter while (e.MoveNext()) { count++; -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK var writeSize = formatter.Serialize(ref bytes, offset, e.Current, formatterResolver); #else var writeSize = formatter.Serialize(ref bytes, (int)offset, (TElement)e.Current, (IFormatterResolver)formatterResolver); @@ -332,7 +332,7 @@ public TCollection Deserialize(byte[] bytes, int offset, IFormatterResolver form { return collection.Count; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK else { var c2 = sequence as IReadOnlyCollection; @@ -921,7 +921,7 @@ public IDictionary Deserialize(byte[] bytes, int offset, IFormatterResolver form } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public sealed class ObservableCollectionFormatter : CollectionFormatterBase> { diff --git a/src/MessagePack/Formatters/DictionaryFormatter.cs b/src/MessagePack/Formatters/DictionaryFormatter.cs index 1035a7f10..ea7a3a6e7 100644 --- a/src/MessagePack/Formatters/DictionaryFormatter.cs +++ b/src/MessagePack/Formatters/DictionaryFormatter.cs @@ -3,13 +3,13 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Collections.Concurrent; #endif namespace MessagePack.Formatters { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK // unfortunately, can't use IDictionary because supports IReadOnlyDictionary. public abstract class DictionaryFormatterBase : IMessagePackFormatter diff --git a/src/MessagePack/Formatters/DynamicObjectTypeFallbackFormatter.cs b/src/MessagePack/Formatters/DynamicObjectTypeFallbackFormatter.cs index 48e2209f2..3380229f4 100644 --- a/src/MessagePack/Formatters/DynamicObjectTypeFallbackFormatter.cs +++ b/src/MessagePack/Formatters/DynamicObjectTypeFallbackFormatter.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using MessagePack.Resolvers; using System; diff --git a/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs b/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs index 84aba7dce..3a0cbb965 100644 --- a/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs +++ b/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs @@ -5,7 +5,7 @@ using System.Globalization; using System.Text; -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Threading.Tasks; #endif @@ -404,7 +404,7 @@ public BitArray Deserialize(byte[] bytes, int offset, IFormatterResolver formatt } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public sealed class BigIntegerFormatter : IMessagePackFormatter { diff --git a/src/MessagePack/Formatters/TupleFormatter.cs b/src/MessagePack/Formatters/TupleFormatter.cs index 545b9ae0e..7348f54d4 100644 --- a/src/MessagePack/Formatters/TupleFormatter.cs +++ b/src/MessagePack/Formatters/TupleFormatter.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; diff --git a/src/MessagePack/Formatters/TypelessFormatter.cs b/src/MessagePack/Formatters/TypelessFormatter.cs index f946f39c1..ab06da095 100644 --- a/src/MessagePack/Formatters/TypelessFormatter.cs +++ b/src/MessagePack/Formatters/TypelessFormatter.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using MessagePack.Internal; using System; diff --git a/src/MessagePack/Formatters/UnsafeBinaryFormatters.cs b/src/MessagePack/Formatters/UnsafeBinaryFormatters.cs index 7c6cabd8e..d28a99cb3 100644 --- a/src/MessagePack/Formatters/UnsafeBinaryFormatters.cs +++ b/src/MessagePack/Formatters/UnsafeBinaryFormatters.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; diff --git a/src/MessagePack/Formatters/ValueTupleFormatter.cs b/src/MessagePack/Formatters/ValueTupleFormatter.cs index 9ec96c12c..87039785e 100644 --- a/src/MessagePack/Formatters/ValueTupleFormatter.cs +++ b/src/MessagePack/Formatters/ValueTupleFormatter.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; namespace MessagePack.Formatters diff --git a/src/MessagePack/Internal/AsymmetricKeyHashTable.cs b/src/MessagePack/Internal/AsymmetricKeyHashTable.cs index 9b18d8eca..fbe6fac9b 100644 --- a/src/MessagePack/Internal/AsymmetricKeyHashTable.cs +++ b/src/MessagePack/Internal/AsymmetricKeyHashTable.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; diff --git a/src/MessagePack/Internal/AutomataDictionary.cs b/src/MessagePack/Internal/AutomataDictionary.cs index 42808e8f3..41436a3f4 100644 --- a/src/MessagePack/Internal/AutomataDictionary.cs +++ b/src/MessagePack/Internal/AutomataDictionary.cs @@ -19,7 +19,7 @@ public AutomataDictionary() root = new AutomataNode(0); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public unsafe void Add(string str, int value) { var bytes = Encoding.UTF8.GetBytes(str); @@ -235,7 +235,7 @@ public AutomataNode Add(ulong key, int value, string originalKey) return v; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public unsafe AutomataNode SearchNext(ref byte* p, ref int rest) { @@ -340,7 +340,7 @@ public void EmitSearchNext(ILGenerator il, LocalBuilder p, LocalBuilder rest, Lo // key = AutomataKeyGen.GetKey(ref p, ref rest); il.EmitLdloca(p); il.EmitLdloca(rest); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK il.EmitCall(AutomataKeyGen.GetKeyMethod); #else il.EmitCall(AutomataKeyGen.GetGetKeyMethod()); @@ -460,7 +460,7 @@ public static class AutomataKeyGen { public delegate ulong PointerDelegate(ref T p, ref int rest); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static readonly MethodInfo GetKeyMethod = typeof(AutomataKeyGen).GetRuntimeMethod("GetKey", new[] { typeof(byte).MakePointerType().MakeByRefType(), typeof(int).MakeByRefType() }); #endif @@ -682,7 +682,7 @@ public static MethodInfo GetGetKeyMethod() #endif -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static unsafe ulong GetKey(ref byte* p, ref int rest) { diff --git a/src/MessagePack/Internal/ByteArrayComparer.cs b/src/MessagePack/Internal/ByteArrayComparer.cs index fcf9f89b2..74e99946c 100644 --- a/src/MessagePack/Internal/ByteArrayComparer.cs +++ b/src/MessagePack/Internal/ByteArrayComparer.cs @@ -8,7 +8,7 @@ public static class ByteArrayComparer { #if ENABLE_UNSAFE_MSGPACK -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK static readonly bool Is32Bit = (IntPtr.Size == 4); @@ -27,7 +27,7 @@ public static int GetHashCode(byte[] bytes, int offset, int count) #endif -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static unsafe bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys) @@ -35,7 +35,7 @@ public static unsafe bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys return Equals(xs, xsOffset, xsCount, ys, 0, ys.Length); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static unsafe bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys, int ysOffset, int ysCount) @@ -97,7 +97,7 @@ public static unsafe bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys } #else -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys) @@ -115,7 +115,7 @@ public static bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys) return true; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static bool Equals(byte[] xs, int xsOffset, int xsCount, byte[] ys, int ysOffset, int ysCount) diff --git a/src/MessagePack/Internal/ByteArrayStringHashTable.cs b/src/MessagePack/Internal/ByteArrayStringHashTable.cs index 1373b4184..ad154fb95 100644 --- a/src/MessagePack/Internal/ByteArrayStringHashTable.cs +++ b/src/MessagePack/Internal/ByteArrayStringHashTable.cs @@ -84,7 +84,7 @@ public bool TryGetValue(ArraySegment key, out int value) if (entry == null) goto NOT_FOUND; { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK ref var v = ref entry[0]; #else var v = entry[0]; @@ -98,7 +98,7 @@ public bool TryGetValue(ArraySegment key, out int value) for (int i = 1; i < entry.Length; i++) { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK ref var v = ref entry[i]; #else var v = entry[i]; @@ -115,16 +115,16 @@ public bool TryGetValue(ArraySegment key, out int value) return false; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK static readonly bool Is32Bit = (IntPtr.Size == 4); #endif -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif static ulong ByteArrayGetHashCode(byte[] x, int offset, int count) { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK // FarmHash https://github.com/google/farmhash if (x == null) return 0; diff --git a/src/MessagePack/Internal/DynamicAssembly.cs b/src/MessagePack/Internal/DynamicAssembly.cs index 4891f876b..575f47e34 100644 --- a/src/MessagePack/Internal/DynamicAssembly.cs +++ b/src/MessagePack/Internal/DynamicAssembly.cs @@ -8,7 +8,7 @@ namespace MessagePack.Internal { internal class DynamicAssembly { -#if NET_35 +#if NETFRAMEWORK readonly string moduleName; #endif readonly AssemblyBuilder assemblyBuilder; @@ -21,12 +21,12 @@ internal class DynamicAssembly public DynamicAssembly(string moduleName) { -#if NET_35 +#if NETFRAMEWORK this.moduleName = moduleName; this.assemblyBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(moduleName), AssemblyBuilderAccess.RunAndSave); this.moduleBuilder = assemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".dll"); #else -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK this.assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(moduleName), AssemblyBuilderAccess.Run); #else this.assemblyBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(moduleName), AssemblyBuilderAccess.Run); @@ -62,7 +62,7 @@ public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, Typ } } -#if NET_35 +#if NETFRAMEWORK public AssemblyBuilder Save() { diff --git a/src/MessagePack/Internal/FarmHash.cs b/src/MessagePack/Internal/FarmHash.cs index ca7e7b241..1890be6e7 100644 --- a/src/MessagePack/Internal/FarmHash.cs +++ b/src/MessagePack/Internal/FarmHash.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Runtime.CompilerServices; diff --git a/src/MessagePack/Internal/GuidBits.cs b/src/MessagePack/Internal/GuidBits.cs index 92a8b75af..93397c109 100644 --- a/src/MessagePack/Internal/GuidBits.cs +++ b/src/MessagePack/Internal/GuidBits.cs @@ -160,7 +160,7 @@ public GuidBits(ArraySegment utf8string) throw new ArgumentException("Invalid Guid Pattern."); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif static byte Parse(byte[] bytes, int highOffset) @@ -168,7 +168,7 @@ static byte Parse(byte[] bytes, int highOffset) return unchecked((byte)(SwitchParse(bytes[highOffset]) * 16 + SwitchParse(bytes[highOffset + 1]))); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif static byte SwitchParse(byte b) diff --git a/src/MessagePack/Internal/ReflectionExtensions.cs b/src/MessagePack/Internal/ReflectionExtensions.cs index 28b7e4888..8823273d7 100644 --- a/src/MessagePack/Internal/ReflectionExtensions.cs +++ b/src/MessagePack/Internal/ReflectionExtensions.cs @@ -33,7 +33,7 @@ public static bool IsIndexer(this System.Reflection.PropertyInfo propertyInfo) return propertyInfo.GetIndexParameters().Length > 0; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static bool IsConstructedGenericType(this System.Reflection.TypeInfo type) { diff --git a/src/MessagePack/Internal/ThreadsafeTypeKeyHashTable.cs b/src/MessagePack/Internal/ThreadsafeTypeKeyHashTable.cs index 380b1f351..9ba034db4 100644 --- a/src/MessagePack/Internal/ThreadsafeTypeKeyHashTable.cs +++ b/src/MessagePack/Internal/ThreadsafeTypeKeyHashTable.cs @@ -181,7 +181,7 @@ static int CalculateCapacity(int collectionSize, float loadFactor) static void VolatileWrite(ref Entry location, Entry value) { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK System.Threading.Volatile.Write(ref location, value); #elif UNITY_WSA || NET_4_6 System.Threading.Volatile.Write(ref location, value); @@ -193,7 +193,7 @@ static void VolatileWrite(ref Entry location, Entry value) static void VolatileWrite(ref Entry[] location, Entry[] value) { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK System.Threading.Volatile.Write(ref location, value); #elif UNITY_WSA || NET_4_6 System.Threading.Volatile.Write(ref location, value); diff --git a/src/MessagePack/Internal/UnsafeMemory.Low.cs b/src/MessagePack/Internal/UnsafeMemory.Low.cs index 2027994a7..1684038c6 100644 --- a/src/MessagePack/Internal/UnsafeMemory.Low.cs +++ b/src/MessagePack/Internal/UnsafeMemory.Low.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; using System.Runtime.CompilerServices; diff --git a/src/MessagePack/Internal/UnsafeMemory.cs b/src/MessagePack/Internal/UnsafeMemory.cs index 9f2a82afd..4eac46652 100644 --- a/src/MessagePack/Internal/UnsafeMemory.cs +++ b/src/MessagePack/Internal/UnsafeMemory.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Runtime.CompilerServices; diff --git a/src/MessagePack/LZ4/Codec/LZ4Codec.Helper.cs b/src/MessagePack/LZ4/Codec/LZ4Codec.Helper.cs index 25b8a378d..9b6e20b99 100644 --- a/src/MessagePack/LZ4/Codec/LZ4Codec.Helper.cs +++ b/src/MessagePack/LZ4/Codec/LZ4Codec.Helper.cs @@ -4,7 +4,7 @@ namespace MessagePack.LZ4 { public static partial class LZ4Codec { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static int Encode(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset, int outputLength) { diff --git a/src/MessagePack/LZ4/LZ4MessagePackSerializer.JSON.cs b/src/MessagePack/LZ4/LZ4MessagePackSerializer.JSON.cs index 4e6197206..a2df3f2d5 100644 --- a/src/MessagePack/LZ4/LZ4MessagePackSerializer.JSON.cs +++ b/src/MessagePack/LZ4/LZ4MessagePackSerializer.JSON.cs @@ -192,7 +192,7 @@ static int ToJsonCore(byte[] bytes, int offset, StringBuilder builder) builder.Append(dt.ToString("o", CultureInfo.InvariantCulture)); builder.Append("\""); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK else if (extHeader.TypeCode == TypelessFormatter.ExtensionTypeCode) { int startOffset = offset; diff --git a/src/MessagePack/LZ4/LZ4MessagePackSerializer.NonGeneric.cs b/src/MessagePack/LZ4/LZ4MessagePackSerializer.NonGeneric.cs index e2ad66113..0d02bc928 100644 --- a/src/MessagePack/LZ4/LZ4MessagePackSerializer.NonGeneric.cs +++ b/src/MessagePack/LZ4/LZ4MessagePackSerializer.NonGeneric.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; using System.Linq; diff --git a/src/MessagePack/LZ4/LZ4MessagePackSerializer.Typeless.cs b/src/MessagePack/LZ4/LZ4MessagePackSerializer.Typeless.cs index f8c870d3b..b7deeea17 100644 --- a/src/MessagePack/LZ4/LZ4MessagePackSerializer.Typeless.cs +++ b/src/MessagePack/LZ4/LZ4MessagePackSerializer.Typeless.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; using System.Collections.Generic; diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index 5cb9f544b..8b32e40f5 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -1,134 +1,87 @@  - - netstandard1.6;netstandard2.0;net45;net47 - MessagePack - True - ..\..\opensource.snk - false - + + netstandard1.6;netstandard2.0;net45;net47 + $(NoWarn);CS0649 + True + $(DefineConstants);ENABLE_UNSAFE_MSGPACK + True - - True - TRACE;DEBUG;NETSTANDARD;ENABLE_UNSAFE_MSGPACK; - True - 7 - + true + Codestin Search App + Extremely Fast MessagePack(MsgPack) Serializer for C#(.NET, .NET Core, Unity, Xamarin). + MsgPack;MessagePack;Serialization;Formatter;Serializer;Unity;Xamarin + - - True - bin\Release\netstandard2.0\MessagePack.xml - 1701;1702;1705;1591 - TRACE;RELEASE;NETSTANDARD;ENABLE_UNSAFE_MSGPACK; - True - 7 - - - - True - TRACE;DEBUG;NETSTANDARD;ENABLE_UNSAFE_MSGPACK;NET45; - True - 7 - - - - True - 1701;1702;1705;1591 - TRACE;RELEASE;NETSTANDARD;ENABLE_UNSAFE_MSGPACK;NET45; - True - 7 - - - - - - - - - - - - - - + + + + + + + - - - - + + + - + + - - + - - - - - - - - - - - - - - ForceSizePrimitiveFormatter.cs - TextTemplatingFileGenerator - - - TextTemplatingFileGenerator - PrimitiveFormatter.cs - - - TextTemplatingFileGenerator - TupleFormatter.cs - - - TextTemplatingFileGenerator - ValueTupleFormatter.cs - - - UnsafeMemory.cs - TextTemplatingFileGenerator - - - - - - + + + ForceSizePrimitiveFormatter.cs + TextTemplatingFileGenerator + + + TextTemplatingFileGenerator + PrimitiveFormatter.cs + + + TextTemplatingFileGenerator + TupleFormatter.cs + + + TextTemplatingFileGenerator + ValueTupleFormatter.cs + + + UnsafeMemory.cs + TextTemplatingFileGenerator + + - - - True - True - ForceSizePrimitiveFormatter.tt - - - True - True - PrimitiveFormatter.tt - - - True - True - TupleFormatter.tt - - - True - True - ValueTupleFormatter.tt - - - UnsafeMemory.tt - True - True - - - \ No newline at end of file + + + True + True + ForceSizePrimitiveFormatter.tt + + + True + True + PrimitiveFormatter.tt + + + True + True + TupleFormatter.tt + + + True + True + ValueTupleFormatter.tt + + + UnsafeMemory.tt + True + True + + + diff --git a/src/MessagePack/MessagePackBinary.cs b/src/MessagePack/MessagePackBinary.cs index bc3cbd786..2352f4505 100644 --- a/src/MessagePack/MessagePackBinary.cs +++ b/src/MessagePack/MessagePackBinary.cs @@ -248,7 +248,7 @@ static MessagePackBinary() dateTimeDecoders[MessagePackCode.Ext8] = Decoders.Ext8DateTime.Instance; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static void EnsureCapacity(ref byte[] bytes, int offset, int appendLength) @@ -297,7 +297,7 @@ public static void EnsureCapacity(ref byte[] bytes, int offset, int appendLength } // Buffer.BlockCopy version of Array.Resize -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static void FastResize(ref byte[] array, int newSize) @@ -319,7 +319,7 @@ public static void FastResize(ref byte[] array, int newSize) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static byte[] FastCloneWithResize(byte[] array, int newSize) @@ -338,7 +338,7 @@ public static byte[] FastCloneWithResize(byte[] array, int newSize) return array3; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static MessagePackType GetMessagePackType(byte[] bytes, int offset) @@ -346,7 +346,7 @@ public static MessagePackType GetMessagePackType(byte[] bytes, int offset) return MessagePackCode.ToMessagePackType(bytes[offset]); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadNext(byte[] bytes, int offset) @@ -354,7 +354,7 @@ public static int ReadNext(byte[] bytes, int offset) return readNextDecoders[bytes[offset]].Read(bytes, offset); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadNextBlock(byte[] bytes, int offset) @@ -399,7 +399,7 @@ public static int ReadNextBlock(byte[] bytes, int offset) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteNil(ref byte[] bytes, int offset) @@ -410,7 +410,7 @@ public static int WriteNil(ref byte[] bytes, int offset) return 1; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static Nil ReadNil(byte[] bytes, int offset, out int readSize) @@ -426,7 +426,7 @@ public static Nil ReadNil(byte[] bytes, int offset, out int readSize) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static bool IsNil(byte[] bytes, int offset) @@ -438,7 +438,7 @@ public static int WriteRaw(ref byte[] bytes, int offset, byte[] rawMessagePackBl { EnsureCapacity(ref bytes, offset, rawMessagePackBlock.Length); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK if (UnsafeMemory.Is32Bit) { switch (rawMessagePackBlock.Length) @@ -653,7 +653,7 @@ public static int WriteRaw(ref byte[] bytes, int offset, byte[] rawMessagePackBl /// Unsafe. If value is guranteed 0 ~ MessagePackRange.MaxFixMapCount(15), can use this method. ///

+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

/// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteFixedMapHeaderUnsafe(ref byte[] bytes, int offset, int count) @@ -666,7 +666,7 @@ public static int WriteFixedMapHeaderUnsafe(ref byte[] bytes, int offset, int co /// /// Write map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteMapHeader(ref byte[] bytes, int offset, int count) @@ -680,7 +680,7 @@ public static int WriteMapHeader(ref byte[] bytes, int offset, int count) /// /// Write map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteMapHeader(ref byte[] bytes, int offset, uint count) @@ -720,7 +720,7 @@ public static int WriteMapHeader(ref byte[] bytes, int offset, uint count) /// /// Write map format header, always use map32 format(length is fixed, 5). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteMapHeaderForceMap32Block(ref byte[] bytes, int offset, uint count) @@ -740,7 +740,7 @@ public static int WriteMapHeaderForceMap32Block(ref byte[] bytes, int offset, ui /// /// Return map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadMapHeader(byte[] bytes, int offset, out int readSize) @@ -754,7 +754,7 @@ public static int ReadMapHeader(byte[] bytes, int offset, out int readSize) /// /// Return map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadMapHeaderRaw(byte[] bytes, int offset, out int readSize) @@ -762,7 +762,7 @@ public static uint ReadMapHeaderRaw(byte[] bytes, int offset, out int readSize) return mapHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int GetArrayHeaderLength(int count) @@ -785,7 +785,7 @@ public static int GetArrayHeaderLength(int count) /// Unsafe. If value is guranteed 0 ~ MessagePackRange.MaxFixArrayCount(15), can use this method. /// /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteFixedArrayHeaderUnsafe(ref byte[] bytes, int offset, int count) @@ -798,7 +798,7 @@ public static int WriteFixedArrayHeaderUnsafe(ref byte[] bytes, int offset, int /// /// Write array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteArrayHeader(ref byte[] bytes, int offset, int count) @@ -812,7 +812,7 @@ public static int WriteArrayHeader(ref byte[] bytes, int offset, int count) /// /// Write array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteArrayHeader(ref byte[] bytes, int offset, uint count) @@ -852,7 +852,7 @@ public static int WriteArrayHeader(ref byte[] bytes, int offset, uint count) /// /// Write array format header, always use array32 format(length is fixed, 5). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteArrayHeaderForceArray32Block(ref byte[] bytes, int offset, uint count) @@ -872,7 +872,7 @@ public static int WriteArrayHeaderForceArray32Block(ref byte[] bytes, int offset /// /// Return array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadArrayHeader(byte[] bytes, int offset, out int readSize) @@ -886,7 +886,7 @@ public static int ReadArrayHeader(byte[] bytes, int offset, out int readSize) /// /// Return array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadArrayHeaderRaw(byte[] bytes, int offset, out int readSize) @@ -894,7 +894,7 @@ public static uint ReadArrayHeaderRaw(byte[] bytes, int offset, out int readSize return arrayHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteBoolean(ref byte[] bytes, int offset, bool value) @@ -905,7 +905,7 @@ public static int WriteBoolean(ref byte[] bytes, int offset, bool value) return 1; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static bool ReadBoolean(byte[] bytes, int offset, out int readSize) @@ -914,7 +914,7 @@ public static bool ReadBoolean(byte[] bytes, int offset, out int readSize) return booleanDecoders[bytes[offset]].Read(); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteByte(ref byte[] bytes, int offset, byte value) @@ -934,7 +934,7 @@ public static int WriteByte(ref byte[] bytes, int offset, byte value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteByteForceByteBlock(ref byte[] bytes, int offset, byte value) @@ -945,7 +945,7 @@ public static int WriteByteForceByteBlock(ref byte[] bytes, int offset, byte val return 2; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static byte ReadByte(byte[] bytes, int offset, out int readSize) @@ -953,7 +953,7 @@ public static byte ReadByte(byte[] bytes, int offset, out int readSize) return byteDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteBytes(ref byte[] bytes, int offset, byte[] value) @@ -968,7 +968,7 @@ public static int WriteBytes(ref byte[] bytes, int offset, byte[] value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteBytes(ref byte[] dest, int dstOffset, byte[] src, int srcOffset, int count) @@ -1023,7 +1023,7 @@ public static int WriteBytes(ref byte[] dest, int dstOffset, byte[] src, int src } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static byte[] ReadBytes(byte[] bytes, int offset, out int readSize) @@ -1031,7 +1031,7 @@ public static byte[] ReadBytes(byte[] bytes, int offset, out int readSize) return bytesDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ArraySegment ReadBytesSegment(byte[] bytes, int offset, out int readSize) @@ -1039,7 +1039,7 @@ public static ArraySegment ReadBytesSegment(byte[] bytes, int offset, out return bytesSegmentDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteSByte(ref byte[] bytes, int offset, sbyte value) @@ -1059,7 +1059,7 @@ public static int WriteSByte(ref byte[] bytes, int offset, sbyte value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteSByteForceSByteBlock(ref byte[] bytes, int offset, sbyte value) @@ -1070,7 +1070,7 @@ public static int WriteSByteForceSByteBlock(ref byte[] bytes, int offset, sbyte return 2; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static sbyte ReadSByte(byte[] bytes, int offset, out int readSize) @@ -1078,7 +1078,7 @@ public static sbyte ReadSByte(byte[] bytes, int offset, out int readSize) return sbyteDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteSingle(ref byte[] bytes, int offset, float value) @@ -1106,7 +1106,7 @@ public static int WriteSingle(ref byte[] bytes, int offset, float value) return 5; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static float ReadSingle(byte[] bytes, int offset, out int readSize) @@ -1114,7 +1114,7 @@ public static float ReadSingle(byte[] bytes, int offset, out int readSize) return singleDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteDouble(ref byte[] bytes, int offset, double value) @@ -1150,7 +1150,7 @@ public static int WriteDouble(ref byte[] bytes, int offset, double value) return 9; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static double ReadDouble(byte[] bytes, int offset, out int readSize) @@ -1158,7 +1158,7 @@ public static double ReadDouble(byte[] bytes, int offset, out int readSize) return doubleDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt16(ref byte[] bytes, int offset, short value) @@ -1215,7 +1215,7 @@ public static int WriteInt16(ref byte[] bytes, int offset, short value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt16ForceInt16Block(ref byte[] bytes, int offset, short value) @@ -1227,7 +1227,7 @@ public static int WriteInt16ForceInt16Block(ref byte[] bytes, int offset, short return 3; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static short ReadInt16(byte[] bytes, int offset, out int readSize) @@ -1238,7 +1238,7 @@ public static short ReadInt16(byte[] bytes, int offset, out int readSize) /// /// Unsafe. If value is guranteed 0 ~ MessagePackCode.MaxFixInt(127), can use this method. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WritePositiveFixedIntUnsafe(ref byte[] bytes, int offset, int value) @@ -1248,7 +1248,7 @@ public static int WritePositiveFixedIntUnsafe(ref byte[] bytes, int offset, int return 1; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt32(ref byte[] bytes, int offset, int value) @@ -1328,7 +1328,7 @@ public static int WriteInt32(ref byte[] bytes, int offset, int value) /// /// Acquire static message block(always 5 bytes). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt32ForceInt32Block(ref byte[] bytes, int offset, int value) @@ -1342,7 +1342,7 @@ public static int WriteInt32ForceInt32Block(ref byte[] bytes, int offset, int va return 5; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadInt32(byte[] bytes, int offset, out int readSize) @@ -1350,7 +1350,7 @@ public static int ReadInt32(byte[] bytes, int offset, out int readSize) return int32Decoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt64(ref byte[] bytes, int offset, long value) @@ -1455,7 +1455,7 @@ public static int WriteInt64(ref byte[] bytes, int offset, long value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt64ForceInt64Block(ref byte[] bytes, int offset, long value) @@ -1473,7 +1473,7 @@ public static int WriteInt64ForceInt64Block(ref byte[] bytes, int offset, long v return 9; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static long ReadInt64(byte[] bytes, int offset, out int readSize) @@ -1481,7 +1481,7 @@ public static long ReadInt64(byte[] bytes, int offset, out int readSize) return int64Decoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt16(ref byte[] bytes, int offset, ushort value) @@ -1509,7 +1509,7 @@ public static int WriteUInt16(ref byte[] bytes, int offset, ushort value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt16ForceUInt16Block(ref byte[] bytes, int offset, ushort value) @@ -1521,7 +1521,7 @@ public static int WriteUInt16ForceUInt16Block(ref byte[] bytes, int offset, usho return 3; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ushort ReadUInt16(byte[] bytes, int offset, out int readSize) @@ -1529,7 +1529,7 @@ public static ushort ReadUInt16(byte[] bytes, int offset, out int readSize) return uint16Decoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt32(ref byte[] bytes, int offset, uint value) @@ -1567,7 +1567,7 @@ public static int WriteUInt32(ref byte[] bytes, int offset, uint value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt32ForceUInt32Block(ref byte[] bytes, int offset, uint value) @@ -1581,7 +1581,7 @@ public static int WriteUInt32ForceUInt32Block(ref byte[] bytes, int offset, uint return 5; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadUInt32(byte[] bytes, int offset, out int readSize) @@ -1589,7 +1589,7 @@ public static uint ReadUInt32(byte[] bytes, int offset, out int readSize) return uint32Decoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt64(ref byte[] bytes, int offset, ulong value) @@ -1641,7 +1641,7 @@ public static int WriteUInt64(ref byte[] bytes, int offset, ulong value) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt64ForceUInt64Block(ref byte[] bytes, int offset, ulong value) @@ -1659,7 +1659,7 @@ public static int WriteUInt64ForceUInt64Block(ref byte[] bytes, int offset, ulon return 9; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ulong ReadUInt64(byte[] bytes, int offset, out int readSize) @@ -1667,7 +1667,7 @@ public static ulong ReadUInt64(byte[] bytes, int offset, out int readSize) return uint64Decoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteChar(ref byte[] bytes, int offset, char value) @@ -1675,7 +1675,7 @@ public static int WriteChar(ref byte[] bytes, int offset, char value) return WriteUInt16(ref bytes, offset, (ushort)value); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static char ReadChar(byte[] bytes, int offset, out int readSize) @@ -1686,7 +1686,7 @@ public static char ReadChar(byte[] bytes, int offset, out int readSize) /// /// Unsafe. If value is guranteed length is 0 ~ 31, can use this method. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteFixedStringUnsafe(ref byte[] bytes, int offset, string value, int byteCount) @@ -1701,7 +1701,7 @@ public static int WriteFixedStringUnsafe(ref byte[] bytes, int offset, string va /// /// Unsafe. If pre-calculated byteCount of target string, can use this method. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteStringUnsafe(ref byte[] bytes, int offset, string value, int byteCount) @@ -1743,7 +1743,7 @@ public static int WriteStringUnsafe(ref byte[] bytes, int offset, string value, } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteStringBytes(ref byte[] bytes, int offset, byte[] utf8stringBytes) @@ -1923,7 +1923,7 @@ public static int WriteStringForceStr32Block(ref byte[] bytes, int offset, strin return byteCount + 5; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static string ReadString(byte[] bytes, int offset, out int readSize) @@ -1931,7 +1931,7 @@ public static string ReadString(byte[] bytes, int offset, out int readSize) return stringDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ArraySegment ReadStringSegment(byte[] bytes, int offset, out int readSize) @@ -1939,7 +1939,7 @@ public static ArraySegment ReadStringSegment(byte[] bytes, int offset, out return stringSegmentDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteExtensionFormatHeader(ref byte[] bytes, int offset, sbyte typeCode, int dataLength) @@ -2009,7 +2009,7 @@ public static int WriteExtensionFormatHeader(ref byte[] bytes, int offset, sbyte /// /// Write extension format header, always use ext32 format(length is fixed, 6). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteExtensionFormatHeaderForceExt32Block(ref byte[] bytes, int offset, sbyte typeCode, int dataLength) @@ -2024,7 +2024,7 @@ public static int WriteExtensionFormatHeaderForceExt32Block(ref byte[] bytes, in return 6; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteExtensionFormat(ref byte[] bytes, int offset, sbyte typeCode, byte[] data) @@ -2126,7 +2126,7 @@ public static int WriteExtensionFormat(ref byte[] bytes, int offset, sbyte typeC } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ExtensionResult ReadExtensionFormat(byte[] bytes, int offset, out int readSize) @@ -2137,7 +2137,7 @@ public static ExtensionResult ReadExtensionFormat(byte[] bytes, int offset, out /// /// return byte length of ExtensionFormat. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ExtensionHeader ReadExtensionFormatHeader(byte[] bytes, int offset, out int readSize) @@ -2145,7 +2145,7 @@ public static ExtensionHeader ReadExtensionFormatHeader(byte[] bytes, int offset return extHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int GetExtensionFormatHeaderLength(int dataLength) @@ -2180,7 +2180,7 @@ public static int GetExtensionFormatHeaderLength(int dataLength) // FixExt8(-1) => nanoseconds + seconds | [1970-01-01 00:00:00.000000000 UTC, 2514-05-30 01:53:04.000000000 UTC) range // Ext8(12,-1) => nanoseconds + seconds | [-584554047284-02-23 16:59:44 UTC, 584554051223-11-09 07:00:16.000000000 UTC) range -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteDateTime(ref byte[] bytes, int offset, DateTime dateTime) @@ -2275,7 +2275,7 @@ struct timespec { } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static DateTime ReadDateTime(byte[] bytes, int offset, out int readSize) @@ -2570,7 +2570,7 @@ static void ReadFully(Stream stream, byte[] bytes, int offset, int readSize) } } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadNext(Stream stream) @@ -2579,7 +2579,7 @@ public static int ReadNext(Stream stream) return ReadMessageBlockFromStreamCore(stream, ref bytes, 0, true); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadNextBlock(Stream stream) @@ -2589,7 +2589,7 @@ public static int ReadNextBlock(Stream stream) return ReadMessageBlockFromStreamCore(stream, ref bytes, offset, false); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteNil(Stream stream) @@ -2598,7 +2598,7 @@ public static int WriteNil(Stream stream) return 1; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static Nil ReadNil(Stream stream) @@ -2610,7 +2610,7 @@ public static Nil ReadNil(Stream stream) return ReadNil(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static bool IsNil(Stream stream) @@ -2625,7 +2625,7 @@ public static bool IsNil(Stream stream) /// Unsafe. If value is guranteed 0 ~ MessagePackRange.MaxFixMapCount(15), can use this method. /// /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteFixedMapHeaderUnsafe(Stream stream, int count) @@ -2637,7 +2637,7 @@ public static int WriteFixedMapHeaderUnsafe(Stream stream, int count) /// /// Write map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteMapHeader(Stream stream, int count) @@ -2651,7 +2651,7 @@ public static int WriteMapHeader(Stream stream, int count) /// /// Write map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteMapHeader(Stream stream, uint count) @@ -2665,7 +2665,7 @@ public static int WriteMapHeader(Stream stream, uint count) /// /// Write map format header, always use map32 format(length is fixed, 5). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteMapHeaderForceMap32Block(Stream stream, uint count) @@ -2679,7 +2679,7 @@ public static int WriteMapHeaderForceMap32Block(Stream stream, uint count) /// /// Return map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadMapHeader(Stream stream) @@ -2696,7 +2696,7 @@ public static int ReadMapHeader(Stream stream) /// /// Return map count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadMapHeaderRaw(Stream stream) @@ -2711,7 +2711,7 @@ public static uint ReadMapHeaderRaw(Stream stream) /// Unsafe. If value is guranteed 0 ~ MessagePackRange.MaxFixArrayCount(15), can use this method. /// /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteFixedArrayHeaderUnsafe(Stream stream, int count) @@ -2723,7 +2723,7 @@ public static int WriteFixedArrayHeaderUnsafe(Stream stream, int count) /// /// Write array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteArrayHeader(Stream stream, int count) @@ -2737,7 +2737,7 @@ public static int WriteArrayHeader(Stream stream, int count) /// /// Write array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteArrayHeader(Stream stream, uint count) @@ -2751,7 +2751,7 @@ public static int WriteArrayHeader(Stream stream, uint count) /// /// Write array format header, always use array32 format(length is fixed, 5). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteArrayHeaderForceArray32Block(Stream stream, uint count) @@ -2765,7 +2765,7 @@ public static int WriteArrayHeaderForceArray32Block(Stream stream, uint count) /// /// Return array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadArrayHeader(Stream stream) @@ -2779,7 +2779,7 @@ public static int ReadArrayHeader(Stream stream) /// /// Return array count. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadArrayHeaderRaw(Stream stream) @@ -2790,7 +2790,7 @@ public static uint ReadArrayHeaderRaw(Stream stream) return ReadArrayHeaderRaw(bytes, 0, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteBoolean(Stream stream, bool value) @@ -2801,7 +2801,7 @@ public static int WriteBoolean(Stream stream, bool value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static bool ReadBoolean(Stream stream) @@ -2813,7 +2813,7 @@ public static bool ReadBoolean(Stream stream) return ReadBoolean(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteByte(Stream stream, byte value) @@ -2824,7 +2824,7 @@ public static int WriteByte(Stream stream, byte value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteByteForceByteBlock(Stream stream, byte value) @@ -2835,7 +2835,7 @@ public static int WriteByteForceByteBlock(Stream stream, byte value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static byte ReadByte(Stream stream) @@ -2847,7 +2847,7 @@ public static byte ReadByte(Stream stream) return ReadByte(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteBytes(Stream stream, byte[] value) @@ -2858,7 +2858,7 @@ public static int WriteBytes(Stream stream, byte[] value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteBytes(Stream stream, byte[] src, int srcOffset, int count) @@ -2869,7 +2869,7 @@ public static int WriteBytes(Stream stream, byte[] src, int srcOffset, int count return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static byte[] ReadBytes(Stream stream) @@ -2881,7 +2881,7 @@ public static byte[] ReadBytes(Stream stream) return ReadBytes(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteSByte(Stream stream, sbyte value) @@ -2892,7 +2892,7 @@ public static int WriteSByte(Stream stream, sbyte value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteSByteForceSByteBlock(Stream stream, sbyte value) @@ -2903,7 +2903,7 @@ public static int WriteSByteForceSByteBlock(Stream stream, sbyte value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static sbyte ReadSByte(Stream stream) @@ -2915,7 +2915,7 @@ public static sbyte ReadSByte(Stream stream) return ReadSByte(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteSingle(Stream stream, float value) @@ -2926,7 +2926,7 @@ public static int WriteSingle(Stream stream, float value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static float ReadSingle(Stream stream) @@ -2938,7 +2938,7 @@ public static float ReadSingle(Stream stream) return ReadSingle(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteDouble(Stream stream, double value) @@ -2949,7 +2949,7 @@ public static int WriteDouble(Stream stream, double value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static double ReadDouble(Stream stream) @@ -2961,7 +2961,7 @@ public static double ReadDouble(Stream stream) return ReadDouble(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt16(Stream stream, short value) @@ -2972,7 +2972,7 @@ public static int WriteInt16(Stream stream, short value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt16ForceInt16Block(Stream stream, short value) @@ -2983,7 +2983,7 @@ public static int WriteInt16ForceInt16Block(Stream stream, short value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static short ReadInt16(Stream stream) @@ -2998,7 +2998,7 @@ public static short ReadInt16(Stream stream) /// /// Unsafe. If value is guranteed 0 ~ MessagePackCode.MaxFixInt(127), can use this method. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WritePositiveFixedIntUnsafe(Stream stream, int value) @@ -3009,7 +3009,7 @@ public static int WritePositiveFixedIntUnsafe(Stream stream, int value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt32(Stream stream, int value) @@ -3023,7 +3023,7 @@ public static int WriteInt32(Stream stream, int value) /// /// Acquire static message block(always 5 bytes). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt32ForceInt32Block(Stream stream, int value) @@ -3034,7 +3034,7 @@ public static int WriteInt32ForceInt32Block(Stream stream, int value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int ReadInt32(Stream stream) @@ -3046,7 +3046,7 @@ public static int ReadInt32(Stream stream) return ReadInt32(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt64(Stream stream, long value) @@ -3057,7 +3057,7 @@ public static int WriteInt64(Stream stream, long value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteInt64ForceInt64Block(Stream stream, long value) @@ -3068,7 +3068,7 @@ public static int WriteInt64ForceInt64Block(Stream stream, long value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static long ReadInt64(Stream stream) @@ -3080,7 +3080,7 @@ public static long ReadInt64(Stream stream) return ReadInt64(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt16(Stream stream, ushort value) @@ -3091,7 +3091,7 @@ public static int WriteUInt16(Stream stream, ushort value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt16ForceUInt16Block(Stream stream, ushort value) @@ -3102,7 +3102,7 @@ public static int WriteUInt16ForceUInt16Block(Stream stream, ushort value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ushort ReadUInt16(Stream stream) @@ -3114,7 +3114,7 @@ public static ushort ReadUInt16(Stream stream) return ReadUInt16(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt32(Stream stream, uint value) @@ -3125,7 +3125,7 @@ public static int WriteUInt32(Stream stream, uint value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt32ForceUInt32Block(Stream stream, uint value) @@ -3136,7 +3136,7 @@ public static int WriteUInt32ForceUInt32Block(Stream stream, uint value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadUInt32(Stream stream) @@ -3148,7 +3148,7 @@ public static uint ReadUInt32(Stream stream) return ReadUInt32(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt64(Stream stream, ulong value) @@ -3159,7 +3159,7 @@ public static int WriteUInt64(Stream stream, ulong value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteUInt64ForceUInt64Block(Stream stream, ulong value) @@ -3170,7 +3170,7 @@ public static int WriteUInt64ForceUInt64Block(Stream stream, ulong value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ulong ReadUInt64(Stream stream) @@ -3182,7 +3182,7 @@ public static ulong ReadUInt64(Stream stream) return ReadUInt64(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteChar(Stream stream, char value) @@ -3193,7 +3193,7 @@ public static int WriteChar(Stream stream, char value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static char ReadChar(Stream stream) @@ -3208,7 +3208,7 @@ public static char ReadChar(Stream stream) /// /// Unsafe. If value is guranteed length is 0 ~ 31, can use this method. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteFixedStringUnsafe(Stream stream, string value, int byteCount) @@ -3222,7 +3222,7 @@ public static int WriteFixedStringUnsafe(Stream stream, string value, int byteCo /// /// Unsafe. If pre-calculated byteCount of target string, can use this method. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteStringUnsafe(Stream stream, string value, int byteCount) @@ -3233,7 +3233,7 @@ public static int WriteStringUnsafe(Stream stream, string value, int byteCount) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteStringBytes(Stream stream, byte[] utf8stringBytes) @@ -3260,7 +3260,7 @@ public static int WriteStringForceStr32Block(Stream stream, string value) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static string ReadString(Stream stream) @@ -3272,7 +3272,7 @@ public static string ReadString(Stream stream) return ReadString(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteExtensionFormatHeader(Stream stream, sbyte typeCode, int dataLength) @@ -3286,7 +3286,7 @@ public static int WriteExtensionFormatHeader(Stream stream, sbyte typeCode, int /// /// Write extension format header, always use ext32 format(length is fixed, 6). /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteExtensionFormatHeaderForceExt32Block(Stream stream, sbyte typeCode, int dataLength) @@ -3297,7 +3297,7 @@ public static int WriteExtensionFormatHeaderForceExt32Block(Stream stream, sbyte return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteExtensionFormat(Stream stream, sbyte typeCode, byte[] data) @@ -3308,7 +3308,7 @@ public static int WriteExtensionFormat(Stream stream, sbyte typeCode, byte[] dat return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ExtensionResult ReadExtensionFormat(Stream stream) @@ -3323,7 +3323,7 @@ public static ExtensionResult ReadExtensionFormat(Stream stream) /// /// return byte length of ExtensionFormat. /// -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static ExtensionHeader ReadExtensionFormatHeader(Stream stream) @@ -3335,7 +3335,7 @@ public static ExtensionHeader ReadExtensionFormatHeader(Stream stream) return ReadExtensionFormatHeader(bytes, offset, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static int WriteDateTime(Stream stream, DateTime dateTime) @@ -3346,7 +3346,7 @@ public static int WriteDateTime(Stream stream, DateTime dateTime) return writeCount; } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static DateTime ReadDateTime(Stream stream) diff --git a/src/MessagePack/MessagePackSerializer.Json.cs b/src/MessagePack/MessagePackSerializer.Json.cs index bf144d5c6..0f96edf09 100644 --- a/src/MessagePack/MessagePackSerializer.Json.cs +++ b/src/MessagePack/MessagePackSerializer.Json.cs @@ -262,7 +262,7 @@ static int ToJsonCore(byte[] bytes, int offset, StringBuilder builder) builder.Append(dt.ToString("o", CultureInfo.InvariantCulture)); builder.Append("\""); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK else if (extHeader.TypeCode == TypelessFormatter.ExtensionTypeCode) { int startOffset = offset; diff --git a/src/MessagePack/MessagePackSerializer.NonGeneric.cs b/src/MessagePack/MessagePackSerializer.NonGeneric.cs index 110203af7..8ccc21853 100644 --- a/src/MessagePack/MessagePackSerializer.NonGeneric.cs +++ b/src/MessagePack/MessagePackSerializer.NonGeneric.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; using System.IO; diff --git a/src/MessagePack/MessagePackSerializer.Typeless.cs b/src/MessagePack/MessagePackSerializer.Typeless.cs index 97d1ac435..4adcb0427 100644 --- a/src/MessagePack/MessagePackSerializer.Typeless.cs +++ b/src/MessagePack/MessagePackSerializer.Typeless.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; using System.Collections.Generic; diff --git a/src/MessagePack/MessagePackSerializer.cs b/src/MessagePack/MessagePackSerializer.cs index 33de750e2..e485b0152 100644 --- a/src/MessagePack/MessagePackSerializer.cs +++ b/src/MessagePack/MessagePackSerializer.cs @@ -127,7 +127,7 @@ public static int Serialize(ref byte[] bytes, int offset, T value, IFormatter return resolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value, resolver); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK /// /// Serialize to stream(async). @@ -254,7 +254,7 @@ public static T Deserialize(byte[] bytes, int offset, IFormatterResolver reso return resolver.GetFormatterWithVerify().Deserialize(bytes, offset, resolver, out readSize); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static System.Threading.Tasks.Task DeserializeAsync(Stream stream) { diff --git a/src/MessagePack/Resolvers/BuiltinResolver.cs b/src/MessagePack/Resolvers/BuiltinResolver.cs index cceb95bba..29ca38b1c 100644 --- a/src/MessagePack/Resolvers/BuiltinResolver.cs +++ b/src/MessagePack/Resolvers/BuiltinResolver.cs @@ -128,7 +128,7 @@ internal static class BuiltinResolverGetFormatterHelper { typeof(ArraySegment), ByteArraySegmentFormatter.Instance }, { typeof(ArraySegment?),new StaticNullableFormatter>(ByteArraySegmentFormatter.Instance) }, -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK {typeof(System.Numerics.BigInteger), BigIntegerFormatter.Instance}, {typeof(System.Numerics.BigInteger?), new StaticNullableFormatter(BigIntegerFormatter.Instance)}, {typeof(System.Numerics.Complex), ComplexFormatter.Instance}, diff --git a/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs b/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs index c27887b90..88c531b27 100644 --- a/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs +++ b/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using MessagePack.Formatters; using MessagePack.Internal; diff --git a/src/MessagePack/Resolvers/DynamicEnumResolver.cs b/src/MessagePack/Resolvers/DynamicEnumResolver.cs index 8d605dd9d..3d41ef1e9 100644 --- a/src/MessagePack/Resolvers/DynamicEnumResolver.cs +++ b/src/MessagePack/Resolvers/DynamicEnumResolver.cs @@ -33,7 +33,7 @@ static DynamicEnumResolver() } -#if NET_35 +#if NETFRAMEWORK public AssemblyBuilder Save() { return assembly.Save(); diff --git a/src/MessagePack/Resolvers/DynamicGenericResolver.cs b/src/MessagePack/Resolvers/DynamicGenericResolver.cs index 9eb54f8b3..8b388e4d4 100644 --- a/src/MessagePack/Resolvers/DynamicGenericResolver.cs +++ b/src/MessagePack/Resolvers/DynamicGenericResolver.cs @@ -9,7 +9,7 @@ using System.Collections.ObjectModel; using System.Collections; -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Threading.Tasks; #endif @@ -62,7 +62,7 @@ internal static class DynamicGenericResolverGetFormatterHelper {typeof(SortedList<,>), typeof(SortedListFormatter<,>)}, {typeof(ILookup<,>), typeof(InterfaceLookupFormatter<,>)}, {typeof(IGrouping<,>), typeof(InterfaceGroupingFormatter<,>)}, -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK {typeof(ObservableCollection<>), typeof(ObservableCollectionFormatter<>)}, {typeof(ReadOnlyObservableCollection<>),(typeof(ReadOnlyObservableCollectionFormatter<>))}, {typeof(IReadOnlyList<>), typeof(InterfaceReadOnlyListFormatter<>)}, @@ -129,7 +129,7 @@ internal static object GetFormatter(Type t) return CreateInstance(typeof(NullableFormatter<>), new[] { nullableElementType }); } -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK // ValueTask else if (genericType == typeof(ValueTask<>)) diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index af8d3938e..94803900e 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -35,7 +35,7 @@ static DynamicObjectResolver() assembly = new DynamicAssembly(ModuleName); } -#if NET_35 +#if NETFRAMEWORK public AssemblyBuilder Save() { return assembly.Save(); @@ -163,7 +163,7 @@ static DynamicContractlessObjectResolver() assembly = new DynamicAssembly(ModuleName); } -#if NET_35 +#if NETFRAMEWORK public AssemblyBuilder Save() { return assembly.Save(); @@ -280,7 +280,7 @@ namespace MessagePack.Internal { internal static class DynamicObjectTypeBuilder { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK static readonly Regex SubtractFullNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=\w+, PublicKeyToken=\w+", RegexOptions.Compiled); #else static readonly Regex SubtractFullNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=\w+, PublicKeyToken=\w+"); @@ -676,7 +676,7 @@ static void BuildSerialize(Type type, ObjectSerializationInfo info, ILGenerator il.Emit(OpCodes.Ldelem_Ref); // Optimize, WriteRaw(Unity, large) or UnsafeMemory32/64.WriteRawX -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK var valueLen = MessagePackBinary.GetEncodedStringBytes(item.StringKey).Length; if (valueLen <= MessagePackRange.MaxFixStringLength) { @@ -1806,7 +1806,7 @@ public object ReflectionLoadValue(object value) { if (IsProperty) { - return PropertyInfo.GetValue(value); + return PropertyInfo.GetValue(value, null); } else { @@ -1818,7 +1818,7 @@ public void ReflectionStoreValue(object obj, object value) { if (IsProperty) { - PropertyInfo.SetValue(obj, value); + PropertyInfo.SetValue(obj, value, null); } else { diff --git a/src/MessagePack/Resolvers/DynamicUnionResolver.cs b/src/MessagePack/Resolvers/DynamicUnionResolver.cs index a0c07e964..60e4d7a62 100644 --- a/src/MessagePack/Resolvers/DynamicUnionResolver.cs +++ b/src/MessagePack/Resolvers/DynamicUnionResolver.cs @@ -22,7 +22,7 @@ public sealed class DynamicUnionResolver : IFormatterResolver const string ModuleName = "MessagePack.Resolvers.DynamicUnionResolver"; static readonly DynamicAssembly assembly; -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK static readonly Regex SubtractFullNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=\w+, PublicKeyToken=\w+", RegexOptions.Compiled); #else static readonly Regex SubtractFullNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=\w+, PublicKeyToken=\w+"); @@ -40,7 +40,7 @@ static DynamicUnionResolver() assembly = new DynamicAssembly(ModuleName); } -#if NET_35 +#if NETFRAMEWORK public AssemblyBuilder Save() { return assembly.Save(); diff --git a/src/MessagePack/Resolvers/PrimitiveObjectResolver.cs b/src/MessagePack/Resolvers/PrimitiveObjectResolver.cs index 24b7f4904..10862175c 100644 --- a/src/MessagePack/Resolvers/PrimitiveObjectResolver.cs +++ b/src/MessagePack/Resolvers/PrimitiveObjectResolver.cs @@ -29,7 +29,7 @@ static FormatterCache() } } -//#if NETSTANDARD +//#if NETSTANDARD || NETFRAMEWORK // /// // /// In `object`, when serializing resolve by concrete type and when deserializing use primitive. diff --git a/src/MessagePack/Resolvers/StandardResolver.cs b/src/MessagePack/Resolvers/StandardResolver.cs index 406d6df67..f2f707d23 100644 --- a/src/MessagePack/Resolvers/StandardResolver.cs +++ b/src/MessagePack/Resolvers/StandardResolver.cs @@ -12,7 +12,7 @@ public sealed class StandardResolver : IFormatterResolver { public static readonly IFormatterResolver Instance = new StandardResolver(); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static readonly IMessagePackFormatter ObjectFallbackFormatter = new DynamicObjectTypeFallbackFormatter(StandardResolverCore.Instance); #endif @@ -34,7 +34,7 @@ static FormatterCache() if (typeof(T) == typeof(object)) { // final fallback -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK formatter = (IMessagePackFormatter)ObjectFallbackFormatter; #else formatter = PrimitiveObjectResolver.Instance.GetFormatter(); @@ -52,7 +52,7 @@ public sealed class ContractlessStandardResolver : IFormatterResolver { public static readonly IFormatterResolver Instance = new ContractlessStandardResolver(); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static readonly IMessagePackFormatter ObjectFallbackFormatter = new DynamicObjectTypeFallbackFormatter(ContractlessStandardResolverCore.Instance); #endif @@ -74,7 +74,7 @@ static FormatterCache() if (typeof(T) == typeof(object)) { // final fallback -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK formatter = (IMessagePackFormatter)ObjectFallbackFormatter; #else formatter = PrimitiveObjectResolver.Instance.GetFormatter(); @@ -92,7 +92,7 @@ public sealed class StandardResolverAllowPrivate : IFormatterResolver { public static readonly IFormatterResolver Instance = new StandardResolverAllowPrivate(); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static readonly IMessagePackFormatter ObjectFallbackFormatter = new DynamicObjectTypeFallbackFormatter(StandardResolverAllowPrivateCore.Instance); #endif @@ -114,7 +114,7 @@ static FormatterCache() if (typeof(T) == typeof(object)) { // final fallback -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK formatter = (IMessagePackFormatter)ObjectFallbackFormatter; #else formatter = PrimitiveObjectResolver.Instance.GetFormatter(); @@ -132,7 +132,7 @@ public sealed class ContractlessStandardResolverAllowPrivate : IFormatterResolve { public static readonly IFormatterResolver Instance = new ContractlessStandardResolverAllowPrivate(); -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK public static readonly IMessagePackFormatter ObjectFallbackFormatter = new DynamicObjectTypeFallbackFormatter(ContractlessStandardResolverAllowPrivateCore.Instance); #endif @@ -154,7 +154,7 @@ static FormatterCache() if (typeof(T) == typeof(object)) { // final fallback -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK formatter = (IMessagePackFormatter)ObjectFallbackFormatter; #else formatter = PrimitiveObjectResolver.Instance.GetFormatter(); @@ -178,7 +178,7 @@ internal static class StandardResolverHelper BuiltinResolver.Instance, // Try Builtin AttributeFormatterResolver.Instance, // Try use [MessagePackFormatter] -#if !NETSTANDARD +#if !(NETSTANDARD || NETFRAMEWORK) MessagePack.Unity.UnityResolver.Instance, #endif diff --git a/src/MessagePack/Resolvers/TypelessContractlessStandardResolver.cs b/src/MessagePack/Resolvers/TypelessContractlessStandardResolver.cs index 7a69f680b..1471acc74 100644 --- a/src/MessagePack/Resolvers/TypelessContractlessStandardResolver.cs +++ b/src/MessagePack/Resolvers/TypelessContractlessStandardResolver.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using MessagePack.Formatters; namespace MessagePack.Resolvers diff --git a/src/MessagePack/Resolvers/TypelessObjectResolver.cs b/src/MessagePack/Resolvers/TypelessObjectResolver.cs index bbd86b32f..aadf73aac 100644 --- a/src/MessagePack/Resolvers/TypelessObjectResolver.cs +++ b/src/MessagePack/Resolvers/TypelessObjectResolver.cs @@ -5,7 +5,7 @@ namespace MessagePack.Resolvers { -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK /// /// Used for `object` fields/collections, ex: var arr = new object[] { 1, "a", new Model() }; diff --git a/src/MessagePack/Resolvers/UnsafeBinaryResolver.cs b/src/MessagePack/Resolvers/UnsafeBinaryResolver.cs index 69e847d79..e4cb6affc 100644 --- a/src/MessagePack/Resolvers/UnsafeBinaryResolver.cs +++ b/src/MessagePack/Resolvers/UnsafeBinaryResolver.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using MessagePack.Formatters; using MessagePack.Internal; diff --git a/src/MessagePack/_AssemblyInfo.cs b/src/MessagePack/_AssemblyInfo.cs deleted file mode 100644 index 8fe3f55ad..000000000 --- a/src/MessagePack/_AssemblyInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MessagePack")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("b23e464e-0ac2-47c9-9520-ea98cbb99575")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] - -// sn.exe -Tp -//[assembly: InternalsVisibleTo("MessagePack.Tests, PublicKey=" + -//"0024000004800000940000000602000000240000525341310004000001000100293894d4e8ad2b" + -//"53afbea4e949ef54c2a388b08b5ebd143c811da82f22aa20c839ed1c0b4da83e7195e8c1dbe1bf" + -//"3934e4e8fd7fb93f893439106fbf055a97c7fac0f7f8c39e58e78371dc0e3825e5b9d7e2afff03" + -//"72f03c4d67ff7df0dbfb58dcadeb1044840de152bf8270de7fc54255ace8efd026c16311760d1a" + -//"2570c3e8")] \ No newline at end of file diff --git a/src/MessagePackAnalyzer.Vsix/MessagePackAnalyzer.Vsix.csproj b/src/MessagePackAnalyzer.Vsix/MessagePackAnalyzer.Vsix.csproj index 947d6fdf1..fcc673fc3 100644 --- a/src/MessagePackAnalyzer.Vsix/MessagePackAnalyzer.Vsix.csproj +++ b/src/MessagePackAnalyzer.Vsix/MessagePackAnalyzer.Vsix.csproj @@ -4,10 +4,6 @@ 15.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - 14.0 - publish\ true Disk @@ -36,7 +32,8 @@ Properties MessagePackAnalyzer.Vsix MessagePackAnalyzer.Vsix - v4.5 + MessagePackAnalyzer.Vsix + v4.6 false false false @@ -44,12 +41,14 @@ false false Roslyn + $(BaseOutputPath)$(Configuration)\ + win + false true full false - bin\Debug\ DEBUG;TRACE prompt 4 @@ -57,7 +56,6 @@ pdbonly true - bin\Release\ TRACE prompt 4 @@ -68,7 +66,6 @@ /rootsuffix Roslyn - Designer @@ -90,4 +87,5 @@ - \ No newline at end of file + + diff --git a/src/MessagePackAnalyzer.Vsix/app.config b/src/MessagePackAnalyzer.Vsix/app.config deleted file mode 100644 index 8c2507845..000000000 --- a/src/MessagePackAnalyzer.Vsix/app.config +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MessagePackAnalyzer.Vsix/source.extension.vsixmanifest b/src/MessagePackAnalyzer.Vsix/source.extension.vsixmanifest index f09d2baad..5312b0b41 100644 --- a/src/MessagePackAnalyzer.Vsix/source.extension.vsixmanifest +++ b/src/MessagePackAnalyzer.Vsix/source.extension.vsixmanifest @@ -1,7 +1,7 @@  - + MessagePackAnalyzer MessagePack AnalyzerMessagePack Analyzer diff --git a/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj b/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj index 049bbb8e2..c23cab33a 100644 --- a/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj +++ b/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj @@ -1,103 +1,30 @@ - - - - + - 11.0 - Debug - AnyCPU - AnyCPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E} - Library - Properties - MessagePackAnalyzer - MessagePackAnalyzer - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 + netstandard1.3 + + true + Analyzer of MessagePack for C#, verify rule for [MessagePackObject] and code fix for [Key]. + MsgPack;MessagePack;Serialization;Formatter;Analyzer + false + $(TargetsForTfmSpecificContentInPackage);PackBuildOutputs - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - + + + + all + + - - ..\..\packages\Microsoft.CodeAnalysis.Common.1.3.2\lib\portable-net45+win8\Microsoft.CodeAnalysis.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.1.3.2\lib\portable-net45+win8\Microsoft.CodeAnalysis.CSharp.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.3.2\lib\portable-net45+win8\Microsoft.CodeAnalysis.CSharp.Workspaces.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.3.2\lib\portable-net45+win8\Microsoft.CodeAnalysis.Workspaces.dll - - - ..\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - - - ..\..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll - - - ..\..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll - - - ..\..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll - - - ..\..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll - - - ..\..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - - - ..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll - + + + - - - \ No newline at end of file + + + + + + + diff --git a/src/MessagePackAnalyzer/Properties/AssemblyInfo.cs b/src/MessagePackAnalyzer/Properties/AssemblyInfo.cs deleted file mode 100644 index 776d7f38c..000000000 --- a/src/MessagePackAnalyzer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("MessagePackAnalyzer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MessagePackAnalyzer")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.6.1")] -[assembly: AssemblyFileVersion("1.6.1")] diff --git a/src/MessagePackAnalyzer/app.config b/src/MessagePackAnalyzer/app.config deleted file mode 100644 index 8c2507845..000000000 --- a/src/MessagePackAnalyzer/app.config +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MessagePackAnalyzer/packages.config b/src/MessagePackAnalyzer/packages.config deleted file mode 100644 index 02323d719..000000000 --- a/src/MessagePackAnalyzer/packages.config +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/MessagePack.Tests/MessagePack.Tests.csproj b/tests/MessagePack.Tests/MessagePack.Tests.csproj index d786f7410..a8aabc4ef 100644 --- a/tests/MessagePack.Tests/MessagePack.Tests.csproj +++ b/tests/MessagePack.Tests/MessagePack.Tests.csproj @@ -1,185 +1,33 @@ - - - + - Debug - AnyCPU {9E1A55CA-711D-4F58-A332-735960E3434C} - Library - Properties - MessagePack.Tests - MessagePack.Tests - v4.6.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - AnyCPU - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + net461 true + true + true + true - - - ..\..\packages\MsgPack.Cli.0.9.0-beta2\lib\net46\MsgPack.dll - - - - - ..\..\packages\ReactiveProperty.4.2.2\lib\net46\ReactiveProperty.dll - - - ..\..\packages\ReactiveProperty.4.2.2\lib\net46\ReactiveProperty.NET46.dll - - - - ..\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - True - - - - - - ..\..\packages\System.Reactive.Core.3.1.1\lib\net46\System.Reactive.Core.dll - - - ..\..\packages\System.Reactive.Interfaces.3.1.1\lib\net45\System.Reactive.Interfaces.dll - - - ..\..\packages\System.Reactive.Linq.3.1.1\lib\net46\System.Reactive.Linq.dll - - - ..\..\packages\System.Reactive.PlatformServices.3.1.1\lib\net46\System.Reactive.PlatformServices.dll - - - ..\..\packages\System.Reactive.Windows.Threading.3.1.1\lib\net45\System.Reactive.Windows.Threading.dll - - - - ..\..\packages\System.Runtime.Serialization.Primitives.4.3.0\lib\net46\System.Runtime.Serialization.Primitives.dll - - - ..\..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - ..\..\packages\xunit.abstractions.2.0.1\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.2.0\lib\netstandard1.1\xunit.assert.dll - - - ..\..\packages\xunit.extensibility.core.2.2.0\lib\netstandard1.1\xunit.core.dll - - - ..\..\packages\xunit.extensibility.execution.2.2.0\lib\net452\xunit.execution.desktop.dll - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - {3abc5c4c-2ce4-459e-8666-f2b181c3def3} - SharedData - - - {e066f547-7261-4561-aefc-e64dbfd874f8} - MessagePack.ImmutableCollection - - - {166a16c0-b89f-41af-956a-235c6ca62c25} - MessagePack.ReactiveProperty - - - {c01e1407-7fec-4c1d-b0b4-74d95a317aa6} - MessagePack.UnityShims - - - {7abb33ee-a2f1-492b-8daf-5df89f0f0b79} - MessagePack - + + + + + + + + + + + - - - - - - このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。 - - - - \ No newline at end of file + diff --git a/tests/MessagePack.Tests/Properties/AssemblyInfo.cs b/tests/MessagePack.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 2e6229672..000000000 --- a/tests/MessagePack.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MessagePack.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MessagePack.Tests")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("9e1a55ca-711d-4f58-a332-735960e3434c")] - -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/MessagePack.Tests/app.config b/tests/MessagePack.Tests/app.config deleted file mode 100644 index 6d65f6336..000000000 --- a/tests/MessagePack.Tests/app.config +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/MessagePack.Tests/packages.config b/tests/MessagePack.Tests/packages.config deleted file mode 100644 index d3c74e952..000000000 --- a/tests/MessagePack.Tests/packages.config +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/version.json b/version.json new file mode 100644 index 000000000..c1ecc3c44 --- /dev/null +++ b/version.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", + "version": "1.8-alpha", + "assemblyVersion": { + "precision": "revision" + }, + "publicReleaseRefSpec": [ + "^refs/heads/master$", // we release out of master + "^refs/heads/v\\d+(?:.\\d+)?$" // we also release out of vNN branches + ] +} From 92a88cc2453afc3f63e1bc9ad0adca62899b02b8 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 11 Dec 2018 21:17:52 -0800 Subject: [PATCH 017/105] Get Live Unit Testing going --- tests/MessagePack.Tests/CollectionTest.cs | 2 +- tests/MessagePack.Tests/DictionaryTest.cs | 2 +- tests/MessagePack.Tests/EnumAsStringTest.cs | 2 +- .../ExtensionTests/ImmutableCollectionTest.cs | 2 +- .../ExtensionTests/UnityShimTest.cs | 4 ++-- tests/MessagePack.Tests/FormatterTest.cs | 22 +++++++++++-------- tests/MessagePack.Tests/GenericFormatters.cs | 8 +++---- .../MessagePack.Tests.csproj | 8 +++++-- .../MessagePackBinaryTest.cs | 8 +++---- .../MultiDimentionalArrayTest.cs | 1 - tests/MessagePack.Tests/UnionResolverTest.cs | 2 +- .../Utils/ChainingAssertion.Xunit.cs | 2 ++ tests/MessagePack.Tests/ValueTupleTest.cs | 2 +- 13 files changed, 37 insertions(+), 28 deletions(-) diff --git a/tests/MessagePack.Tests/CollectionTest.cs b/tests/MessagePack.Tests/CollectionTest.cs index 3b2f9a524..4fa2df0be 100644 --- a/tests/MessagePack.Tests/CollectionTest.cs +++ b/tests/MessagePack.Tests/CollectionTest.cs @@ -16,7 +16,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value)); } - public static object collectionTestData = new object[] + public static object[][] collectionTestData = new object[][] { new object[]{ new int[]{ 1,10, 100 } , null }, new object[]{ new List{ 1,10, 100 } , null }, diff --git a/tests/MessagePack.Tests/DictionaryTest.cs b/tests/MessagePack.Tests/DictionaryTest.cs index c3f52c6b6..8d2e8dff5 100644 --- a/tests/MessagePack.Tests/DictionaryTest.cs +++ b/tests/MessagePack.Tests/DictionaryTest.cs @@ -16,7 +16,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value)); } - public static object dictionaryTestData = new object[] + public static object[][] dictionaryTestData = new object[][] { new object[]{ new Dictionary() { { 1, 100 } }, null }, new object[]{ new ReadOnlyDictionary(new Dictionary() { { 1, 100 } }), null }, diff --git a/tests/MessagePack.Tests/EnumAsStringTest.cs b/tests/MessagePack.Tests/EnumAsStringTest.cs index b805dd52d..c87d5e05c 100644 --- a/tests/MessagePack.Tests/EnumAsStringTest.cs +++ b/tests/MessagePack.Tests/EnumAsStringTest.cs @@ -29,7 +29,7 @@ public enum AsStringFlag public class EnumAsStringTest { - public static object enumData = new object[] + public static object[][] enumData = new object[][] { // simple new object[] { AsString.Foo, null, "Foo", "null" }, diff --git a/tests/MessagePack.Tests/ExtensionTests/ImmutableCollectionTest.cs b/tests/MessagePack.Tests/ExtensionTests/ImmutableCollectionTest.cs index 8505810ca..78a9b5b3a 100644 --- a/tests/MessagePack.Tests/ExtensionTests/ImmutableCollectionTest.cs +++ b/tests/MessagePack.Tests/ExtensionTests/ImmutableCollectionTest.cs @@ -28,7 +28,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value, resolver), resolver); } - public static object collectionTestData = new object[] + public static object[][] collectionTestData = new object[][] { new object[]{ ImmutableList.Empty.AddRange(new[] { 1, 10, 100 }) , null }, new object[]{ ImmutableDictionary.Empty.AddRange(new Dictionary { { 1, 10 },{ 2, 10 }, { 3, 100 } }) , null }, diff --git a/tests/MessagePack.Tests/ExtensionTests/UnityShimTest.cs b/tests/MessagePack.Tests/ExtensionTests/UnityShimTest.cs index d46662da6..0f97a1994 100644 --- a/tests/MessagePack.Tests/ExtensionTests/UnityShimTest.cs +++ b/tests/MessagePack.Tests/ExtensionTests/UnityShimTest.cs @@ -36,7 +36,7 @@ T ConvertStandard(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value, UnityResolver.Instance), UnityResolver.Instance); } - public static object[] testData = new object[] + public static object[][] testData = new object[][] { new object[]{ BlitContainer.Create(Enumerable.Range(1, 123).Select(x => new Vector2(x, x)))}, new object[]{ BlitContainer.Create(Enumerable.Range(1, 123).Select(x => new Vector3(x,x, x)))}, @@ -62,7 +62,7 @@ public void BlitTest(BlitContainer blit) ConvertBlit(blit).Array.IsNull(); } - public static object[] testStandardData = new object[] + public static object[][] testStandardData = new object[][] { new object[]{ new Vector2(10,20) }, new object[]{ new Vector3(10,20, 30) }, diff --git a/tests/MessagePack.Tests/FormatterTest.cs b/tests/MessagePack.Tests/FormatterTest.cs index f52e3ce98..d184242e7 100644 --- a/tests/MessagePack.Tests/FormatterTest.cs +++ b/tests/MessagePack.Tests/FormatterTest.cs @@ -17,7 +17,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value)); } - public static object[] primitiveFormatterTestData = new object[] + public static object[][] primitiveFormatterTestData = new object[][] { new object[] { Int16.MinValue, Int16.MaxValue }, new object[] { (Int16?)100, null }, @@ -56,7 +56,7 @@ public void PrimitiveFormatterTest(T x, T? y) Convert(y).Is(y); } - public static object[] enumFormatterTestData = new object[] + public static object[][] enumFormatterTestData = new object[][] { new object[] { ByteEnum.A, ByteEnum.B }, new object[] { (ByteEnum?)ByteEnum.C, null }, @@ -92,7 +92,7 @@ public void NilFormatterTest() Convert((Nil?)null).Is(Nil.Default); } - public static object[] standardStructFormatterTestData = new object[] + public static object[][] standardStructFormatterTestData = new object[][] { new object[] { decimal.MaxValue, decimal.MinValue, null }, new object[] { TimeSpan.MaxValue, TimeSpan.MinValue, null }, @@ -115,15 +115,19 @@ public void PrimitiveStringTest() [Theory] [MemberData(nameof(standardStructFormatterTestData))] - public void StandardClassLibraryStructFormatterTest(T x, T? y, T? z) - where T : struct + public void StandardClassLibraryStructFormatterTest(object x, object y, object z) { - Convert(x).Is(x); - Convert(y).Is(y); - Convert(z).Is(z); + var helper = typeof(FormatterTest).GetMethod(nameof(StandardClassLibraryStructFormatterTest_Helper), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var helperClosedGeneric = helper.MakeGenericMethod(x.GetType()); + + helperClosedGeneric.Invoke(this, new object[] { x }); + helperClosedGeneric.Invoke(this, new object[] { y }); + helperClosedGeneric.Invoke(this, new object[] { z }); } - public static object[] standardClassFormatterTestData = new object[] + private void StandardClassLibraryStructFormatterTest_Helper(T? value) where T : struct => Convert(value).Is(value); + + public static object[][] standardClassFormatterTestData = new object[][] { new object[] { new byte[] { 1, 10, 100 }, new byte[0] { }, null }, new object[] { "aaa", "", null }, diff --git a/tests/MessagePack.Tests/GenericFormatters.cs b/tests/MessagePack.Tests/GenericFormatters.cs index a0e0c7801..a2ef34bed 100644 --- a/tests/MessagePack.Tests/GenericFormatters.cs +++ b/tests/MessagePack.Tests/GenericFormatters.cs @@ -14,7 +14,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value)); } - public static object[] tupleTestData = new object[] + public static object[][] tupleTestData = new object[][] { new object[] { Tuple.Create(1) }, new object[] { Tuple.Create(1,2) }, @@ -47,14 +47,14 @@ public void TupleTest(T data) [Theory(Skip = "AppVeyor Testing")] [MemberData(nameof(tupleTestData))] - public void TupleTest(T data, T? @null) + public void TupleTest2(T data, T? @null) where T : struct { Convert(data).IsStructuralEqual(data); Convert(@null).IsNull(); } - public static object[] keyValuePairData = new object[] + public static object[][] keyValuePairData = new object[][] { new object[] { new KeyValuePair(1,2), null }, new object[] { new KeyValuePair(3,4), new KeyValuePair(5,6) }, @@ -69,7 +69,7 @@ public void KeyValuePairTest(T t, T? t2) Convert(t2).IsStructuralEqual(t2); } - public static object[] byteArraySegementData = new object[] + public static object[][] byteArraySegementData = new object[][] { new object[] { new ArraySegment(new byte[] { 0, 0, 1, 2, 3 }, 2, 3), null, new byte[] { 1, 2, 3 } }, new object[] { new ArraySegment(new byte[0], 0, 0), null, new byte[0] }, diff --git a/tests/MessagePack.Tests/MessagePack.Tests.csproj b/tests/MessagePack.Tests/MessagePack.Tests.csproj index a8aabc4ef..e67f393d7 100644 --- a/tests/MessagePack.Tests/MessagePack.Tests.csproj +++ b/tests/MessagePack.Tests/MessagePack.Tests.csproj @@ -27,7 +27,11 @@ - - + + + all + runtime; build; native; contentfiles; analyzers + + diff --git a/tests/MessagePack.Tests/MessagePackBinaryTest.cs b/tests/MessagePack.Tests/MessagePackBinaryTest.cs index 66c3a9d70..149635bdf 100644 --- a/tests/MessagePack.Tests/MessagePackBinaryTest.cs +++ b/tests/MessagePack.Tests/MessagePackBinaryTest.cs @@ -83,7 +83,7 @@ public void ByteTest(byte target, int length) CreateUnpackedReference(bytes).AsByte().Is(target); } - public static object[] bytesTestData = new object[] + public static object[][] bytesTestData = new object[][] { new object[]{ (byte[])null, 1 }, new object[]{ new byte[] { }, 2 }, @@ -498,7 +498,7 @@ public void UInt64Test(ulong target, int length) } - public static object[] stringTestData = new object[] + public static object[][] stringTestData = new object[][] { new object[]{ "a"}, new object[]{ "abc" }, @@ -586,7 +586,7 @@ public void CharTest(char target) } - public static object[] extTestData = new object[] + public static object[][] extTestData = new object[][] { new object[]{ 0, Enumerable.Repeat((byte)1, 0).ToArray() }, new object[]{ 1, Enumerable.Repeat((byte)1, 1).ToArray() }, @@ -648,7 +648,7 @@ public void ExtTest(sbyte typeCode, byte[] target) // FixExt4(-1) => seconds | [1970-01-01 00:00:00 UTC, 2106-02-07 06:28:16 UTC) range // FixExt8(-1) => nanoseconds + seconds | [1970-01-01 00:00:00.000000000 UTC, 2514-05-30 01:53:04.000000000 UTC) range // Ext8(12,-1) => nanoseconds + seconds | [-584554047284-02-23 16:59:44 UTC, 584554051223-11-09 07:00:16.000000000 UTC) range - public static object[] dateTimeTestData = new object[] + public static object[][] dateTimeTestData = new object[][] { new object[]{ new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), 6}, new object[]{ new DateTime(2010, 12, 1, 3, 4, 57, 0, DateTimeKind.Utc), 6}, diff --git a/tests/MessagePack.Tests/MultiDimentionalArrayTest.cs b/tests/MessagePack.Tests/MultiDimentionalArrayTest.cs index af2730dbf..9def65eb4 100644 --- a/tests/MessagePack.Tests/MultiDimentionalArrayTest.cs +++ b/tests/MessagePack.Tests/MultiDimentionalArrayTest.cs @@ -18,7 +18,6 @@ T Convert(T value) [InlineData(100, 100, 10, 5)] [InlineData(10, 20, 15, 5)] [InlineData(3, 5, 10, 15)] - [InlineData(3, 5, 10, 15)] public void MultiDimentional(int dataI, int dataJ, int dataK, int dataL) { var two = new ValueTuple[dataI, dataJ]; diff --git a/tests/MessagePack.Tests/UnionResolverTest.cs b/tests/MessagePack.Tests/UnionResolverTest.cs index 9cbf48c3e..2bc2f98a4 100644 --- a/tests/MessagePack.Tests/UnionResolverTest.cs +++ b/tests/MessagePack.Tests/UnionResolverTest.cs @@ -17,7 +17,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value)); } - public static object[] unionData = new object[] + public static object[][] unionData = new object[][] { new object[]{new MySubUnion1 { One = 23 }, new MySubUnion1 { One = 23 }}, new object[]{new MySubUnion2 { Two = 233 }, new MySubUnion2 { Two = 233 }}, diff --git a/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs b/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs index 6c3a3a0bf..65e5d801a 100644 --- a/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs +++ b/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs @@ -278,12 +278,14 @@ public static void IsFalse(this bool value) /// Assert.Same public static void IsSameReferenceAs(this T actual, T expected) + where T : class { Assert.Same(expected, actual); } /// Assert.NotSame public static void IsNotSameReferenceAs(this T actual, T notExpected) + where T : class { Assert.NotSame(notExpected, actual); } diff --git a/tests/MessagePack.Tests/ValueTupleTest.cs b/tests/MessagePack.Tests/ValueTupleTest.cs index eff4e769f..86774f399 100644 --- a/tests/MessagePack.Tests/ValueTupleTest.cs +++ b/tests/MessagePack.Tests/ValueTupleTest.cs @@ -14,7 +14,7 @@ T Convert(T value) return MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(value)); } - public static object valueTupleData = new object[] + public static object[][] valueTupleData = new object[][] { new object[] { (1, 2) }, new object[] { (1, 2, 3) }, From 66d7209d70f1cb40ec6a4f6d311037797b9277c6 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 11 Dec 2018 22:08:49 -0800 Subject: [PATCH 018/105] Build and run tests on all supported platforms --- tests/MessagePack.Tests/FormatterTest.cs | 7 ++++--- tests/MessagePack.Tests/MessagePack.Tests.csproj | 10 ++-------- .../TypelessContractlessStandardResolverTest.cs | 12 ++++++++++++ tests/MessagePack.Tests/UnsafeMemoryTest.cs | 1 + 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/MessagePack.Tests/FormatterTest.cs b/tests/MessagePack.Tests/FormatterTest.cs index d184242e7..5539c8d31 100644 --- a/tests/MessagePack.Tests/FormatterTest.cs +++ b/tests/MessagePack.Tests/FormatterTest.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Xunit; @@ -117,7 +118,7 @@ public void PrimitiveStringTest() [MemberData(nameof(standardStructFormatterTestData))] public void StandardClassLibraryStructFormatterTest(object x, object y, object z) { - var helper = typeof(FormatterTest).GetMethod(nameof(StandardClassLibraryStructFormatterTest_Helper), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var helper = typeof(FormatterTest).GetTypeInfo().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Single(m => m.Name == nameof(StandardClassLibraryStructFormatterTest_Helper)); var helperClosedGeneric = helper.MakeGenericMethod(x.GetType()); helperClosedGeneric.Invoke(this, new object[] { x }); @@ -132,7 +133,7 @@ public void StandardClassLibraryStructFormatterTest(object x, object y, object z new object[] { new byte[] { 1, 10, 100 }, new byte[0] { }, null }, new object[] { "aaa", "", null }, new object[] { new Uri("Http://hogehoge.com"), new Uri("Https://hugahuga.com"), null }, - new object[] { new Version(), new Version(1,2,3), new Version(255,100,30) }, + new object[] { new Version(0,0), new Version(1,2,3), new Version(255,100,30) }, new object[] { new Version(1,2), new Version(100, 200,300,400), null }, new object[] { new BitArray(new[] { true, false, true }), new BitArray(1), null }, }; @@ -230,7 +231,7 @@ public void StringTest_Part2() [Fact] public void DecimalLang() { - var estonian = CultureInfo.GetCultureInfo("et-EE"); + var estonian = new CultureInfo("et-EE"); CultureInfo.CurrentCulture = estonian; var b = MessagePackSerializer.Serialize(12345.6789M); diff --git a/tests/MessagePack.Tests/MessagePack.Tests.csproj b/tests/MessagePack.Tests/MessagePack.Tests.csproj index e67f393d7..08400d89f 100644 --- a/tests/MessagePack.Tests/MessagePack.Tests.csproj +++ b/tests/MessagePack.Tests/MessagePack.Tests.csproj @@ -1,11 +1,11 @@  - {9E1A55CA-711D-4F58-A332-735960E3434C} - net461 + net461;net47;netcoreapp1.0;netcoreapp2.0 true true true true + $(NoWarn);CS1701 @@ -21,12 +21,6 @@ - - - - - - all diff --git a/tests/MessagePack.Tests/TypelessContractlessStandardResolverTest.cs b/tests/MessagePack.Tests/TypelessContractlessStandardResolverTest.cs index c9992074e..01644b756 100644 --- a/tests/MessagePack.Tests/TypelessContractlessStandardResolverTest.cs +++ b/tests/MessagePack.Tests/TypelessContractlessStandardResolverTest.cs @@ -93,7 +93,11 @@ public void ObjectRuntimeTypeTest() var p2 = MessagePackSerializer.Deserialize(result, TypelessContractlessStandardResolver.Instance); p.IsStructuralEqual(p2); +#if NETFRAMEWORK MessagePackSerializer.ToJson(result).Is(@"{""Name"":""John"",""Addresses"":[{""$type"":""""System.Object, mscorlib""},{""$type"":""MessagePack.Tests.TypelessContractlessStandardResolverTest+Address, MessagePack.Tests"",""Street"":""Ave.""}]}"); +#else + MessagePackSerializer.ToJson(result).Is(@"{""Name"":""John"",""Addresses"":[{""$type"":""""System.Object, System.Private.CoreLib""},{""$type"":""MessagePack.Tests.TypelessContractlessStandardResolverTest+Address, MessagePack.Tests"",""Street"":""Ave.""}]}"); +#endif } public class A { public int Id; } @@ -133,7 +137,11 @@ public void PreservingTimezoneInTypelessCollectionsTest() var deser = MessagePackSerializer.Deserialize>(result, TypelessContractlessStandardResolver.Instance); deser.IsStructuralEqual(arr); +#if NETFRAMEWORK MessagePackSerializer.ToJson(result).Is(@"{""1"":""a"",""2"":[""System.Object[], mscorlib"",""level2"",[""System.Object[], mscorlib"",""level3"",{""$type"":""MessagePack.Tests.TypelessContractlessStandardResolverTest+Person, MessagePack.Tests"",""Name"":""Peter"",""Addresses"":[{""$type"":""MessagePack.Tests.TypelessContractlessStandardResolverTest+Address, MessagePack.Tests"",""Street"":""St.""},{""$type"":""System.DateTime, mscorlib"",636340858800000000}]}]]}"); +#else + MessagePackSerializer.ToJson(result).Is(@"{""1"":""a"",""2"":[""System.Object[], System.Private.CoreLib"",""level2"",[""System.Object[], System.Private.CoreLib"",""level3"",{""$type"":""MessagePack.Tests.TypelessContractlessStandardResolverTest+Person, MessagePack.Tests"",""Name"":""Peter"",""Addresses"":[{""$type"":""MessagePack.Tests.TypelessContractlessStandardResolverTest+Address, MessagePack.Tests"",""Street"":""St.""},{""$type"":""System.DateTime, System.Private.CoreLib"",636340858800000000}]}]]}"); +#endif } [Fact] @@ -144,7 +152,11 @@ public void PreservingCollectionTypeTest() var deser = MessagePackSerializer.Deserialize(result, TypelessContractlessStandardResolver.Instance); deser.IsStructuralEqual(arr); +#if NETFRAMEWORK MessagePackSerializer.ToJson(result).Is(@"[1,[""System.Object[], mscorlib"",2,[""System.Collections.Generic.LinkedList`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"",""a"",42]]]"); +#else + MessagePackSerializer.ToJson(result).Is(@"[1,[""System.Object[], System.Private.CoreLib"",2,[""System.Collections.Generic.LinkedList`1[[System.Object, System.Private.CoreLib]], System.Collections"",""a"",42]]]"); +#endif } [Theory] diff --git a/tests/MessagePack.Tests/UnsafeMemoryTest.cs b/tests/MessagePack.Tests/UnsafeMemoryTest.cs index 799b6535e..197c7f7b2 100644 --- a/tests/MessagePack.Tests/UnsafeMemoryTest.cs +++ b/tests/MessagePack.Tests/UnsafeMemoryTest.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Xunit; From ecb449239eea63ade47468d477971a06151a25b8 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 11 Dec 2018 22:09:10 -0800 Subject: [PATCH 019/105] Split up solution items a bit --- MessagePack.sln | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/MessagePack.sln b/MessagePack.sln index 33b22a886..2710cef5c 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -14,15 +14,9 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{344DC89D-8761-4552-A70A-B34DC19F39C4}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore - azure-pipelines.yml = azure-pipelines.yml - azure-pipelines\build.yml = azure-pipelines\build.yml - Directory.Build.props = Directory.Build.props - global.json = global.json LICENSE = LICENSE make_unity_symlink.bat = make_unity_symlink.bat - nuget.config = nuget.config README.md = README.md - version.json = version.json EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandbox", "sandbox", "{BF4C4202-5015-4FBD-80E6-D0F36A06F700}" @@ -53,6 +47,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerfBenchmarkDotNet", "sand EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestData2", "sandbox\TestData2\TestData2.csproj", "{2A32A538-BA26-4D89-85D0-E4249AFA0837}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{301F812B-8AEE-4DC2-8009-4510F02294AD}" + ProjectSection(SolutionItems) = preProject + azure-pipelines.yml = azure-pipelines.yml + azure-pipelines\build.yml = azure-pipelines\build.yml + Directory.Build.props = Directory.Build.props + global.json = global.json + nuget.config = nuget.config + version.json = version.json + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From e09b00b49493d415d0fdddfa7e9e6d371edb0f30 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 11 Dec 2018 22:31:50 -0800 Subject: [PATCH 020/105] Consolidate package versions --- sandbox/PerfNetFramework/PerfNetFramework.csproj | 2 +- sandbox/Sandbox/Sandbox.csproj | 4 ++-- sandbox/TestData2/TestData2.csproj | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sandbox/PerfNetFramework/PerfNetFramework.csproj b/sandbox/PerfNetFramework/PerfNetFramework.csproj index eb2a0e472..7991042e7 100644 --- a/sandbox/PerfNetFramework/PerfNetFramework.csproj +++ b/sandbox/PerfNetFramework/PerfNetFramework.csproj @@ -6,7 +6,7 @@ - + diff --git a/sandbox/Sandbox/Sandbox.csproj b/sandbox/Sandbox/Sandbox.csproj index dac06aa47..ce452180d 100644 --- a/sandbox/Sandbox/Sandbox.csproj +++ b/sandbox/Sandbox/Sandbox.csproj @@ -10,9 +10,9 @@ - + - + diff --git a/sandbox/TestData2/TestData2.csproj b/sandbox/TestData2/TestData2.csproj index 893557f7d..d992280d8 100644 --- a/sandbox/TestData2/TestData2.csproj +++ b/sandbox/TestData2/TestData2.csproj @@ -4,7 +4,7 @@ - - + + From 59c9b599c5b8b20c0961390ed61bb01389714504 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 11 Dec 2018 23:07:50 -0800 Subject: [PATCH 021/105] Fix strong naming of shipping assembly --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6195b2bcb..0b97445c1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,6 @@ - + True $(MSBuildThisFileDirectory)..\opensource.snk From b71cd0ec90ca07fc9c2a4d46b517383c5a3b20c4 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Wed, 12 Dec 2018 18:34:16 +0900 Subject: [PATCH 022/105] Add UniversalCodeGenerator(.NET Core linux-x64,osx-x64, win-x64) project. --- MessagePack.sln | 26 +- .../MessagePack.CodeGenerator.csproj | 1 - .../CodeAnalysis/Definitions.cs | 163 ++ .../CodeAnalysis/TypeCollector.cs | 844 ++++++++++ .../Generator/EnumTemplate.cs | 391 +++++ .../Generator/FormatterTemplate.cs | 818 +++++++++ .../Generator/ResolverTemplate.cs | 455 +++++ .../Generator/TemplatePartials.cs | 33 + .../Generator/UnionTemplate.cs | 584 +++++++ .../MessagePack.UniversalCodeGenerator.csproj | 12 + .../Mono.Options/Options.cs | 1463 +++++++++++++++++ .../Program.cs | 179 ++ .../Utils/RoslynExtensions.cs | 214 +++ .../publish.bat | 3 + 14 files changed, 5181 insertions(+), 5 deletions(-) create mode 100644 src/MessagePack.UniversalCodeGenerator/CodeAnalysis/Definitions.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/TemplatePartials.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj create mode 100644 src/MessagePack.UniversalCodeGenerator/Mono.Options/Options.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Program.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs create mode 100644 src/MessagePack.UniversalCodeGenerator/publish.bat diff --git a/MessagePack.sln b/MessagePack.sln index e1e49af13..0bd43dc0f 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -29,7 +29,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{344DC89D-8 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandbox", "sandbox", "{BF4C4202-5015-4FBD-80E6-D0F36A06F700}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.CodeGenerator", "src\MessagePack.CodeGenerator\MessagePack.CodeGenerator.csproj", "{D8B195AC-9E93-438E-8331-EF3A1F613D0B}" EndProject @@ -37,9 +37,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicCodeDumper", "sandbo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedData", "sandbox\SharedData\SharedData.csproj", "{3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UnityShims", "src\MessagePack.UnityShims\MessagePack.UnityShims.csproj", "{C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.UnityShims", "src\MessagePack.UnityShims\MessagePack.UnityShims.csproj", "{C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.ReactiveProperty", "src\MessagePack.ReactiveProperty\MessagePack.ReactiveProperty.csproj", "{166A16C0-B89F-41AF-956A-235C6CA62C25}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.ReactiveProperty", "src\MessagePack.ReactiveProperty\MessagePack.ReactiveProperty.csproj", "{166A16C0-B89F-41AF-956A-235C6CA62C25}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.ImmutableCollection", "src\MessagePack.ImmutableCollection\MessagePack.ImmutableCollection.csproj", "{E066F547-7261-4561-AEFC-E64DBFD874F8}" EndProject @@ -49,12 +49,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePackAnalyzer.Vsix", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PertNetFramework", "sandbox\PertNetFramework\PertNetFramework.csproj", "{014A3DCE-50A6-4774-A4C1-C66EEAB67133}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.AspNetCoreMvcFormatter", "src\MessagePack.AspNetCoreMvcFormatter\MessagePack.AspNetCoreMvcFormatter.csproj", "{17831017-C29C-4A48-B159-849BCE5079FB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.AspNetCoreMvcFormatter", "src\MessagePack.AspNetCoreMvcFormatter\MessagePack.AspNetCoreMvcFormatter.csproj", "{17831017-C29C-4A48-B159-849BCE5079FB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerfBenchmarkDotNet", "sandbox\PerfBenchmarkDotNet\PerfBenchmarkDotNet.csproj", "{814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestData2", "sandbox\TestData2\TestData2.csproj", "{2A32A538-BA26-4D89-85D0-E4249AFA0837}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UniversalCodeGenerator", "src\MessagePack.UniversalCodeGenerator\MessagePack.UniversalCodeGenerator.csproj", "{10AD85DD-929D-49B8-BD43-45242C2644B7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -245,6 +247,18 @@ Global {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x64.Build.0 = Release|Any CPU {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x86.ActiveCfg = Release|Any CPU {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x86.Build.0 = Release|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x64.ActiveCfg = Debug|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x64.Build.0 = Debug|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x86.ActiveCfg = Debug|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x86.Build.0 = Debug|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|Any CPU.Build.0 = Release|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.ActiveCfg = Release|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.Build.0 = Release|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.ActiveCfg = Release|Any CPU + {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -265,5 +279,9 @@ Global {17831017-C29C-4A48-B159-849BCE5079FB} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {2A32A538-BA26-4D89-85D0-E4249AFA0837} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} + {10AD85DD-929D-49B8-BD43-45242C2644B7} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {26F0752B-06F7-44AD-BFEE-8F2E36B3AA27} EndGlobalSection EndGlobal diff --git a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj index 5e300aa95..ab293915b 100644 --- a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj +++ b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj @@ -1,6 +1,5 @@  - Debug diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/Definitions.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/Definitions.cs new file mode 100644 index 000000000..e754d5767 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/Definitions.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MessagePack.CodeGenerator +{ + public interface IResolverRegisterInfo + { + string FullName { get; } + string FormatterName { get; } + } + + public class ObjectSerializationInfo : IResolverRegisterInfo + { + public string Name { get; set; } + public string FullName { get; set; } + public string Namespace { get; set; } + public bool IsIntKey { get; set; } + public bool IsStringKey { get { return !IsIntKey; } } + public bool IsClass { get; set; } + public bool IsStruct { get { return !IsClass; } } + public MemberSerializationInfo[] ConstructorParameters { get; set; } + public MemberSerializationInfo[] Members { get; set; } + public bool HasIMessagePackSerializationCallbackReceiver { get; set; } + public bool NeedsCastOnBefore { get; set; } + public bool NeedsCastOnAfter { get; set; } + public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter"; + + public int WriteCount + { + get + { + if (IsStringKey) + { + return Members.Count(x => x.IsReadable); + } + else + { + return MaxKey; + } + } + } + + public int MaxKey + { + get + { + return Members.Where(x => x.IsReadable).Select(x => x.IntKey).DefaultIfEmpty(-1).Max(); + } + } + + public MemberSerializationInfo GetMember(int index) + { + return Members.FirstOrDefault(x => x.IntKey == index); + } + + public string GetConstructorString() + { + var args = string.Join(", ", ConstructorParameters.Select(x => "__" + x.Name + "__")); + return $"{FullName}({args})"; + } + } + + public class MemberSerializationInfo + { + public bool IsProperty { get; set; } + public bool IsField { get; set; } + public bool IsWritable { get; set; } + public bool IsReadable { get; set; } + public int IntKey { get; set; } + public string StringKey { get; set; } + public string Type { get; set; } + public string Name { get; set; } + public string ShortTypeName { get; set; } + + readonly HashSet primitiveTypes = new HashSet(new string[] + { + "short", + "int", + "long", + "ushort", + "uint", + "ulong", + "float", + "double", + "bool", + "byte", + "sbyte", + "char", + //"global::System.DateTime", + //"byte[]", + //"string", + }); + + public string GetSerializeMethodString() + { + if (primitiveTypes.Contains(Type)) + { + return $"MessagePackBinary.Write{ShortTypeName.Replace("[]", "s")}(ref bytes, offset, value.{Name})"; + } + else + { + return $"formatterResolver.GetFormatterWithVerify<{Type}>().Serialize(ref bytes, offset, value.{Name}, formatterResolver)"; + } + } + + public string GetDeserializeMethodString() + { + if (primitiveTypes.Contains(Type)) + { + return $"MessagePackBinary.Read{ShortTypeName.Replace("[]", "s")}(bytes, offset, out readSize)"; + } + else + { + return $"formatterResolver.GetFormatterWithVerify<{Type}>().Deserialize(bytes, offset, formatterResolver, out readSize)"; + } + } + } + + public class EnumSerializationInfo : IResolverRegisterInfo + { + public string Namespace { get; set; } + public string Name { get; set; } + public string FullName { get; set; } + public string UnderlyingType { get; set; } + + public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter"; + } + + public class GenericSerializationInfo : IResolverRegisterInfo, IEquatable + { + public string FullName { get; set; } + + public string FormatterName { get; set; } + + public bool Equals(GenericSerializationInfo other) + { + return FullName.Equals(other.FullName); + } + + public override int GetHashCode() + { + return FullName.GetHashCode(); + } + } + + public class UnionSerializationInfo : IResolverRegisterInfo + { + public string Namespace { get; set; } + public string Name { get; set; } + public string FullName { get; set; } + public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter"; + public UnionSubTypeInfo[] SubTypes { get; set; } + } + + public class UnionSubTypeInfo + { + public string Type { get; set; } + public int Key { get; set; } + } +} \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs new file mode 100644 index 000000000..e51ebf70d --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs @@ -0,0 +1,844 @@ +using Microsoft.CodeAnalysis; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MessagePack.CodeGenerator +{ + public class ReferenceSymbols + { + public readonly INamedTypeSymbol Task; + public readonly INamedTypeSymbol TaskOfT; + public readonly INamedTypeSymbol MessagePackObjectAttribute; + public readonly INamedTypeSymbol UnionAttribute; + public readonly INamedTypeSymbol SerializationConstructorAttribute; + public readonly INamedTypeSymbol KeyAttribute; + public readonly INamedTypeSymbol IgnoreAttribute; + public readonly INamedTypeSymbol IgnoreDataMemberAttribute; + public readonly INamedTypeSymbol IMessagePackSerializationCallbackReceiver; + + public ReferenceSymbols(Compilation compilation) + { + TaskOfT = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1"); + Task = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task"); + MessagePackObjectAttribute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); + UnionAttribute = compilation.GetTypeByMetadataName("MessagePack.UnionAttribute"); + SerializationConstructorAttribute = compilation.GetTypeByMetadataName("MessagePack.SerializationConstructorAttribute"); + KeyAttribute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); + IgnoreAttribute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute"); + IgnoreDataMemberAttribute = compilation.GetTypeByMetadataName("System.Runtime.Serialization.IgnoreDataMemberAttribute"); + IMessagePackSerializationCallbackReceiver = compilation.GetTypeByMetadataName("MessagePack.IMessagePackSerializationCallbackReceiver"); + } + } + + public class TypeCollector + { + const string CodegeneratorOnlyPreprocessorSymbol = "INCLUDE_ONLY_CODE_GENERATION"; + + static readonly SymbolDisplayFormat binaryWriteFormat = new SymbolDisplayFormat( + genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, + miscellaneousOptions: SymbolDisplayMiscellaneousOptions.ExpandNullable, + typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameOnly); + + static readonly SymbolDisplayFormat shortTypeNameFormat = new SymbolDisplayFormat( + typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypes); + + readonly string csProjPath; + readonly bool isForceUseMap; + readonly ReferenceSymbols typeReferences; + readonly INamedTypeSymbol[] targetTypes; + readonly HashSet embeddedTypes = new HashSet(new string[] + { + "short", + "int", + "long", + "ushort", + "uint", + "ulong", + "float", + "double", + "bool", + "byte", + "sbyte", + "decimal", + "char", + "string", + "object", + "System.Guid", + "System.TimeSpan", + "System.DateTime", + "System.DateTimeOffset", + + "MessagePack.Nil", + + // and arrays + + "short[]", + "int[]", + "long[]", + "ushort[]", + "uint[]", + "ulong[]", + "float[]", + "double[]", + "bool[]", + "byte[]", + "sbyte[]", + "decimal[]", + "char[]", + "string[]", + "System.DateTime[]", + "System.ArraySegment", + "System.ArraySegment?", + + // extensions + + "UnityEngine.Vector2", + "UnityEngine.Vector3", + "UnityEngine.Vector4", + "UnityEngine.Quaternion", + "UnityEngine.Color", + "UnityEngine.Bounds", + "UnityEngine.Rect", + "UnityEngine.AnimationCurve", + "UnityEngine.RectOffset", + "UnityEngine.Gradient", + "UnityEngine.WrapMode", + "UnityEngine.GradientMode", + "UnityEngine.Keyframe", + "UnityEngine.Matrix4x4", + "UnityEngine.GradientColorKey", + "UnityEngine.GradientAlphaKey", + "UnityEngine.Color32", + "UnityEngine.LayerMask", + "UnityEngine.Vector2Int", + "UnityEngine.Vector3Int", + "UnityEngine.RangeInt", + "UnityEngine.RectInt", + "UnityEngine.BoundsInt", + + "System.Reactive.Unit", + }); + + readonly Dictionary knownGenericTypes = new Dictionary + { + {"System.Collections.Generic.List<>", "global::MessagePack.Formatters.ListFormatter" }, + {"System.Collections.Generic.LinkedList<>", "global::MessagePack.Formatters.LinkedListFormatter"}, + {"System.Collections.Generic.Queue<>", "global::MessagePack.Formatters.QeueueFormatter"}, + {"System.Collections.Generic.Stack<>", "global::MessagePack.Formatters.StackFormatter"}, + {"System.Collections.Generic.HashSet<>", "global::MessagePack.Formatters.HashSetFormatter"}, + {"System.Collections.ObjectModel.ReadOnlyCollection<>", "global::MessagePack.Formatters.ReadOnlyCollectionFormatter"}, + {"System.Collections.Generic.IList<>", "global::MessagePack.Formatters.InterfaceListFormatter"}, + {"System.Collections.Generic.ICollection<>", "global::MessagePack.Formatters.InterfaceCollectionFormatter"}, + {"System.Collections.Generic.IEnumerable<>", "global::MessagePack.Formatters.InterfaceEnumerableFormatter"}, + {"System.Collections.Generic.Dictionary<,>", "global::MessagePack.Formatters.DictionaryFormatter"}, + {"System.Collections.Generic.IDictionary<,>", "global::MessagePack.Formatters.InterfaceDictionaryFormatter"}, + {"System.Collections.Generic.SortedDictionary<,>", "global::MessagePack.Formatters.SortedDictionaryFormatter"}, + {"System.Collections.Generic.SortedList<,>", "global::MessagePack.Formatters.SortedListFormatter"}, + {"System.Linq.ILookup<,>", "global::MessagePack.Formatters.InterfaceLookupFormatter"}, + {"System.Linq.IGrouping<,>", "global::MessagePack.Formatters.InterfaceGroupingFormatter"}, + {"System.Collections.ObjectModel.ObservableCollection<>", "global::MessagePack.Formatters.ObservableCollectionFormatter"}, + {"System.Collections.ObjectModel.ReadOnlyObservableCollection<>", "global::MessagePack.Formatters.ReadOnlyObservableCollectionFormatter" }, + {"System.Collections.Generic.IReadOnlyList<>", "global::MessagePack.Formatters.InterfaceReadOnlyListFormatter"}, + {"System.Collections.Generic.IReadOnlyCollection<>", "global::MessagePack.Formatters.InterfaceReadOnlyCollectionFormatter"}, + {"System.Collections.Generic.ISet<>", "global::MessagePack.Formatters.InterfaceSetFormatter"}, + {"System.Collections.Concurrent.ConcurrentBag<>", "global::MessagePack.Formatters.ConcurrentBagFormatter"}, + {"System.Collections.Concurrent.ConcurrentQueue<>", "global::MessagePack.Formatters.ConcurrentQueueFormatter"}, + {"System.Collections.Concurrent.ConcurrentStack<>", "global::MessagePack.Formatters.ConcurrentStackFormatter"}, + {"System.Collections.ObjectModel.ReadOnlyDictionary<,>", "global::MessagePack.Formatters.ReadOnlyDictionaryFormatter"}, + {"System.Collections.Generic.IReadOnlyDictionary<,>", "global::MessagePack.Formatters.InterfaceReadOnlyDictionaryFormatter"}, + {"System.Collections.Concurrent.ConcurrentDictionary<,>", "global::MessagePack.Formatters.ConcurrentDictionaryFormatter"}, + {"System.Lazy<>", "global::MessagePack.Formatters.LazyFormatter"}, + {"System.Threading.Tasks<>", "global::MessagePack.Formatters.TaskValueFormatter"}, + + {"System.Tuple<>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,,>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,,,>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,,,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, + {"System.Tuple<,,,,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, + + {"System.ValueTuple<>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + {"System.ValueTuple<,,,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, + + {"System.Collections.Generic.KeyValuePair<,>", "global::MessagePack.Formatters.KeyValuePairFormatter"}, + {"System.Threading.Tasks.ValueTask<>", "global::MessagePack.Formatters.KeyValuePairFormatter"}, + {"System.ArraySegment<>", "global::MessagePack.Formatters.ArraySegmentFormatter"}, + + // extensions + + {"System.Collections.Immutable.ImmutableArray<>", "global::MessagePack.ImmutableCollection.ImmutableArrayFormatter"}, + {"System.Collections.Immutable.ImmutableList<>", "global::MessagePack.ImmutableCollection.ImmutableListFormatter"}, + {"System.Collections.Immutable.ImmutableDictionary<,>", "global::MessagePack.ImmutableCollection.ImmutableDictionaryFormatter"}, + {"System.Collections.Immutable.ImmutableHashSet<>", "global::MessagePack.ImmutableCollection.ImmutableHashSetFormatter"}, + {"System.Collections.Immutable.ImmutableSortedDictionary<,>", "global::MessagePack.ImmutableCollection.ImmutableSortedDictionaryFormatter"}, + {"System.Collections.Immutable.ImmutableSortedSet<>", "global::MessagePack.ImmutableCollection.ImmutableSortedSetFormatter"}, + {"System.Collections.Immutable.ImmutableQueue<>", "global::MessagePack.ImmutableCollection.ImmutableQueueFormatter"}, + {"System.Collections.Immutable.ImmutableStack<>", "global::MessagePack.ImmutableCollection.ImmutableStackFormatter"}, + {"System.Collections.Immutable.IImmutableList<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableListFormatter"}, + {"System.Collections.Immutable.IImmutableDictionary<,>", "global::MessagePack.ImmutableCollection.InterfaceImmutableDictionaryFormatter"}, + {"System.Collections.Immutable.IImmutableQueue<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableQueueFormatter"}, + {"System.Collections.Immutable.IImmutableSet<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableSetFormatter"}, + {"System.Collections.Immutable.IImmutableStack<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableStackFormatter"}, + + {"Reactive.Bindings.ReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.ReactivePropertyFormatter"}, + {"Reactive.Bindings.IReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.InterfaceReactivePropertyFormatter"}, + {"Reactive.Bindings.IReadOnlyReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.InterfaceReadOnlyReactivePropertyFormatter"}, + {"Reactive.Bindings.ReactiveCollection<>", "global::MessagePack.ReactivePropertyExtension.ReactiveCollectionFormatter"}, + }; + + readonly bool disallowInternal; + + // visitor workspace: + HashSet alreadyCollected; + List collectedObjectInfo; + List collectedEnumInfo; + List collectedGenericInfo; + List collectedUnionInfo; + + // --- + + public TypeCollector(string csProjPath, IEnumerable conditinalSymbols, bool disallowInternal, bool isForceUseMap) + { + this.csProjPath = csProjPath; + var compilation = RoslynExtensions.GetCompilationFromProject(csProjPath, conditinalSymbols.Concat(new[] { CodegeneratorOnlyPreprocessorSymbol }).ToArray()).GetAwaiter().GetResult(); + this.typeReferences = new ReferenceSymbols(compilation); + this.disallowInternal = disallowInternal; + this.isForceUseMap = isForceUseMap; + + targetTypes = compilation.GetNamedTypeSymbols() + .Where(x => + { + if (x.DeclaredAccessibility == Accessibility.Public) return true; + if (!disallowInternal) + { + return (x.DeclaredAccessibility == Accessibility.Friend); + } + + return false; + }) + .Where(x => + ((x.TypeKind == TypeKind.Interface) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) + || ((x.TypeKind == TypeKind.Class && x.IsAbstract) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) + || ((x.TypeKind == TypeKind.Class) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) + || ((x.TypeKind == TypeKind.Struct) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) + ) + .ToArray(); + } + + void ResetWorkspace() + { + alreadyCollected = new HashSet(); + collectedObjectInfo = new List(); + collectedEnumInfo = new List(); + collectedGenericInfo = new List(); + collectedUnionInfo = new List(); + } + + // EntryPoint + public (ObjectSerializationInfo[] objectInfo, EnumSerializationInfo[] enumInfo, GenericSerializationInfo[] genericInfo, UnionSerializationInfo[] unionInfo) Collect() + { + ResetWorkspace(); + + foreach (var item in targetTypes) + { + CollectCore(item); + } + + return (collectedObjectInfo.ToArray(), collectedEnumInfo.ToArray(), collectedGenericInfo.Distinct().ToArray(), collectedUnionInfo.ToArray()); + } + + // Gate of recursive collect + void CollectCore(ITypeSymbol typeSymbol) + { + if (!alreadyCollected.Add(typeSymbol)) + { + return; + } + + if (embeddedTypes.Contains(typeSymbol.ToString())) + { + return; + } + + if (typeSymbol.TypeKind == TypeKind.Array) + { + CollectArray(typeSymbol as IArrayTypeSymbol); + return; + } + + if (!IsAllowAccessibility(typeSymbol)) + { + return; + } + + var type = typeSymbol as INamedTypeSymbol; + + if (typeSymbol.TypeKind == TypeKind.Enum) + { + CollectEnum(type); + return; + } + + if (type.IsGenericType) + { + CollectGeneric(type); + return; + } + + if (type.Locations[0].IsInMetadata) + { + return; + } + + if (type.TypeKind == TypeKind.Interface || (type.TypeKind == TypeKind.Class && type.IsAbstract)) + { + CollectUnion(type); + return; + } + + CollectObject(type); + return; + } + + void CollectEnum(INamedTypeSymbol type) + { + var info = new EnumSerializationInfo + { + Name = type.Name, + Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), + FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + UnderlyingType = type.EnumUnderlyingType.ToDisplayString(binaryWriteFormat) + }; + + collectedEnumInfo.Add(info); + } + + void CollectUnion(INamedTypeSymbol type) + { + var unionAttrs = type.GetAttributes().Where(x => x.AttributeClass == typeReferences.UnionAttribute).Select(x => x.ConstructorArguments).ToArray(); + if (unionAttrs.Length == 0) + { + throw new MessagePackGeneratorResolveFailedException("Serialization Type must mark UnionAttribute." + " type: " + type.Name); + } + + // 0, Int 1, SubType + var info = new UnionSerializationInfo + { + Name = type.Name, + Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), + FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + SubTypes = unionAttrs.Select(x => new UnionSubTypeInfo + { + Key = (int)x[0].Value, + Type = (x[1].Value as ITypeSymbol).ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + }).OrderBy(x => x.Key).ToArray() + }; + + collectedUnionInfo.Add(info); + } + + void CollectArray(IArrayTypeSymbol array) + { + var elemType = array.ElementType; + CollectCore(elemType); + + var info = new GenericSerializationInfo + { + FullName = array.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + }; + + if (array.IsSZArray) + { + info.FormatterName = $"global::MessagePack.Formatters.ArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; + } + else if (array.Rank == 2) + { + info.FormatterName = $"global::MessagePack.Formatters.TwoDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; + } + else if (array.Rank == 3) + { + info.FormatterName = $"global::MessagePack.Formatters.ThreeDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; + } + else if (array.Rank == 4) + { + info.FormatterName = $"global::MessagePack.Formatters.FourDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; + } + else + { + throw new InvalidOperationException("does not supports array dimention, " + info.FullName); + } + + collectedGenericInfo.Add(info); + + return; + } + + void CollectGeneric(INamedTypeSymbol type) + { + var genericType = type.ConstructUnboundGenericType(); + var genericTypeString = genericType.ToDisplayString(); + var fullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + + // special case + if (fullName == "global::System.ArraySegment" || fullName == "global::System.ArraySegment?") + { + return; + } + + // nullable + if (genericTypeString == "T?") + { + CollectCore(type.TypeArguments[0]); + + if (!embeddedTypes.Contains(type.TypeArguments[0].ToString())) + { + var info = new GenericSerializationInfo + { + FormatterName = $"global::MessagePack.Formatters.NullableFormatter<{type.TypeArguments[0].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>", + FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + }; + + collectedGenericInfo.Add(info); + } + return; + } + + // collection + if (knownGenericTypes.TryGetValue(genericTypeString, out var formatter)) + { + foreach (var item in type.TypeArguments) + { + CollectCore(item); + } + + var typeArgs = string.Join(", ", type.TypeArguments.Select(x => x.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))); + var f = formatter.Replace("TREPLACE", typeArgs); + + var info = new GenericSerializationInfo + { + FormatterName = f, + FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + }; + + collectedGenericInfo.Add(info); + + if (genericTypeString == "System.Linq.ILookup<,>") + { + formatter = knownGenericTypes["System.Linq.IGrouping<,>"]; + f = formatter.Replace("TREPLACE", typeArgs); + + var groupingInfo = new GenericSerializationInfo + { + FormatterName = f, + FullName = $"global::System.Linq.IGrouping<{typeArgs}>", + }; + + collectedGenericInfo.Add(groupingInfo); + + formatter = knownGenericTypes["System.Collections.Generic.IEnumerable<>"]; + typeArgs = type.TypeArguments[1].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + f = formatter.Replace("TREPLACE", typeArgs); + + var enumerableInfo = new GenericSerializationInfo + { + FormatterName = f, + FullName = $"global::System.Collections.Generic.IEnumerable<{typeArgs}>", + }; + + collectedGenericInfo.Add(enumerableInfo); + } + } + } + + void CollectObject(INamedTypeSymbol type) + { + var isClass = !type.IsValueType; + + var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribute); + if (contractAttr == null) + { + throw new MessagePackGeneratorResolveFailedException("Serialization Object must mark MessagePackObjectAttribute." + " type: " + type.Name); + } + + var isIntKey = true; + var intMemebrs = new Dictionary(); + var stringMembers = new Dictionary(); + + if (isForceUseMap || (bool)contractAttr.ConstructorArguments[0].Value) + { + // All public members are serialize target except [Ignore] member. + isIntKey = false; + + var hiddenIntKey = 0; + + foreach (var item in type.GetAllMembers().OfType().Where(x => !x.IsOverride)) + { + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; + + var member = new MemberSerializationInfo + { + IsReadable = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, + IsWritable = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, + StringKey = item.Name, + IsProperty = true, + IsField = false, + Name = item.Name, + Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) + }; + if (!member.IsReadable && !member.IsWritable) continue; + member.IntKey = hiddenIntKey++; + stringMembers.Add(member.StringKey, member); + + CollectCore(item.Type); // recursive collect + } + foreach (var item in type.GetAllMembers().OfType()) + { + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; + if (item.IsImplicitlyDeclared) continue; + + var member = new MemberSerializationInfo + { + IsReadable = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, + IsWritable = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic, + StringKey = item.Name, + IsProperty = false, + IsField = true, + Name = item.Name, + Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) + }; + if (!member.IsReadable && !member.IsWritable) continue; + member.IntKey = hiddenIntKey++; + stringMembers.Add(member.StringKey, member); + CollectCore(item.Type); // recursive collect + } + } + else + { + // Only KeyAttribute members + var searchFirst = true; + var hiddenIntKey = 0; + + foreach (var item in type.GetAllMembers().OfType()) + { + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; + + var member = new MemberSerializationInfo + { + IsReadable = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, + IsWritable = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, + IsProperty = true, + IsField = false, + Name = item.Name, + Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) + }; + if (!member.IsReadable && !member.IsWritable) continue; + + var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; + if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); + + var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; + var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null; + if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name); + + if (searchFirst) + { + searchFirst = false; + isIntKey = intKey != null; + } + else + { + if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null)) + { + throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name); + } + } + + if (isIntKey) + { + member.IntKey = (int)intKey; + if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + + intMemebrs.Add(member.IntKey, member); + } + else + { + member.StringKey = (string)stringKey; + if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + + member.IntKey = hiddenIntKey++; + stringMembers.Add(member.StringKey, member); + } + + CollectCore(item.Type); // recursive collect + } + + foreach (var item in type.GetAllMembers().OfType()) + { + if (item.IsImplicitlyDeclared) continue; + if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute)) continue; + + var member = new MemberSerializationInfo + { + IsReadable = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, + IsWritable = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic, + IsProperty = true, + IsField = false, + Name = item.Name, + Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) + }; + if (!member.IsReadable && !member.IsWritable) continue; + + var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; + if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); + + var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; + var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null; + if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name); + + if (searchFirst) + { + searchFirst = false; + isIntKey = intKey != null; + } + else + { + if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null)) + { + throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name); + } + } + + if (isIntKey) + { + member.IntKey = (int)intKey; + if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + + intMemebrs.Add(member.IntKey, member); + } + else + { + member.StringKey = (string)stringKey; + if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + + member.IntKey = hiddenIntKey++; + stringMembers.Add(member.StringKey, member); + } + + CollectCore(item.Type); // recursive collect + } + } + + // GetConstructor + IEnumerator ctorEnumerator = null; + var ctor = type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public).SingleOrDefault(x => x.GetAttributes().Any(y => y.AttributeClass == typeReferences.SerializationConstructorAttribute)); + if (ctor == null) + { + ctorEnumerator = + type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public && !x.IsImplicitlyDeclared).OrderBy(x => x.Parameters.Length) + .Concat(type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public).OrderBy(x => x.Parameters.Length).Take(1)) + .GetEnumerator(); + + if (ctorEnumerator.MoveNext()) + { + ctor = ctorEnumerator.Current; + } + } + + // struct allows null ctor + if (ctor == null && isClass) throw new MessagePackGeneratorResolveFailedException("can't find public constructor. type:" + type.Name); + + var constructorParameters = new List(); + if (ctor != null) + { + var constructorLookupDictionary = stringMembers.ToLookup(x => x.Key, x => x, StringComparer.OrdinalIgnoreCase); + do + { + constructorParameters.Clear(); + var ctorParamIndex = 0; + foreach (var item in ctor.Parameters) + { + MemberSerializationInfo paramMember; + if (isIntKey) + { + if (intMemebrs.TryGetValue(ctorParamIndex, out paramMember)) + { + if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable) + { + constructorParameters.Add(paramMember); + } + else + { + if (ctorEnumerator != null) + { + ctor = null; + continue; + } + else + { + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterIndex:" + ctorParamIndex + " paramterType:" + item.Type.Name); + } + } + } + else + { + if (ctorEnumerator != null) + { + ctor = null; + continue; + } + else + { + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterIndex:" + ctorParamIndex); + } + } + } + else + { + var hasKey = constructorLookupDictionary[item.Name]; + var len = hasKey.Count(); + if (len != 0) + { + if (len != 1) + { + if (ctorEnumerator != null) + { + ctor = null; + continue; + } + else + { + throw new MessagePackGeneratorResolveFailedException("duplicate matched constructor parameter name:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); + } + } + + paramMember = hasKey.First().Value; + if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable) + { + constructorParameters.Add(paramMember); + } + else + { + if (ctorEnumerator != null) + { + ctor = null; + continue; + } + else + { + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); + } + } + } + else + { + if (ctorEnumerator != null) + { + ctor = null; + continue; + } + else + { + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterName:" + item.Name); + } + } + } + ctorParamIndex++; + } + } while (TryGetNextConstructor(ctorEnumerator, ref ctor)); + + if (ctor == null) + { + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor. type:" + type.Name); + } + } + + var hasSerializationConstructor = type.AllInterfaces.Any(x => x == typeReferences.IMessagePackSerializationCallbackReceiver); + var needsCastOnBefore = true; + var needsCastOnAfter = true; + if (hasSerializationConstructor) + { + needsCastOnBefore = !type.GetMembers("OnBeforeSerialize").Any(); + needsCastOnAfter = !type.GetMembers("OnAfterDeserialize").Any(); + } + + var info = new ObjectSerializationInfo + { + IsClass = isClass, + ConstructorParameters = constructorParameters.ToArray(), + IsIntKey = isIntKey, + Members = (isIntKey) ? intMemebrs.Values.ToArray() : stringMembers.Values.ToArray(), + Name = type.ToDisplayString(shortTypeNameFormat).Replace(".", "_"), + FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), + HasIMessagePackSerializationCallbackReceiver = hasSerializationConstructor, + NeedsCastOnAfter = needsCastOnAfter, + NeedsCastOnBefore = needsCastOnBefore + }; + collectedObjectInfo.Add(info); + } + + static bool TryGetNextConstructor(IEnumerator ctorEnumerator, ref IMethodSymbol ctor) + { + if (ctorEnumerator == null || ctor != null) + { + return false; + } + + if (ctorEnumerator.MoveNext()) + { + ctor = ctorEnumerator.Current; + return true; + } + else + { + ctor = null; + return false; + } + } + + bool IsAllowAccessibility(ITypeSymbol symbol) + { + do + { + if (symbol.DeclaredAccessibility != Accessibility.Public) + { + if (disallowInternal) + { + return false; + } + + if (symbol.DeclaredAccessibility != Accessibility.Internal) + { + return true; + } + } + + symbol = symbol.ContainingType; + } while (symbol != null); + + return true; + } + } + + public class MessagePackGeneratorResolveFailedException : Exception + { + public MessagePackGeneratorResolveFailedException(string message) + : base(message) + { + + } + } +} \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs new file mode 100644 index 000000000..ba322bdb4 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs @@ -0,0 +1,391 @@ +// ------------------------------------------------------------------------------ +// +// このコードはツールによって生成されました。 +// ランタイム バージョン: 15.0.0.0 +// +// このファイルへの変更は、正しくない動作の原因になる可能性があり、 +// コードが再生成されると失われます。 +// +// ------------------------------------------------------------------------------ +namespace MessagePack.CodeGenerator.Generator +{ + using System.Linq; + using System.Text; + using System.Collections.Generic; + using System; + + /// + /// Class to produce the template output + /// + + #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public partial class EnumTemplate : EnumTemplateBase + { +#line hidden + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); + + #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); + + #line default + #line hidden + this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n"); + + #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + foreach(var info in enumSerializationInfos) { + + #line default + #line hidden + this.Write(" public sealed class "); + + #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); + + #line default + #line hidden + this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); + + #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(">\r\n {\r\n public int Serialize(ref byte[] bytes, int offset, "); + + #line 19 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n " + + " return MessagePackBinary.Write"); + + #line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); + + #line default + #line hidden + this.Write("(ref bytes, offset, ("); + + #line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); + + #line default + #line hidden + this.Write(")value);\r\n }\r\n \r\n public "); + + #line 24 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" + + "matterResolver, out int readSize)\r\n {\r\n return ("); + + #line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(")MessagePackBinary.Read"); + + #line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); + + #line default + #line hidden + this.Write("(bytes, offset, out readSize);\r\n }\r\n }\r\n\r\n"); + + #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + } + + #line default + #line hidden + this.Write("\r\n}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning " + + "restore 618\r\n#pragma warning restore 612"); + return this.GenerationEnvironment.ToString(); + } + } + + #line default + #line hidden + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public class EnumTemplateBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + protected System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs new file mode 100644 index 000000000..1d9f52c69 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs @@ -0,0 +1,818 @@ +// ------------------------------------------------------------------------------ +// +// このコードはツールによって生成されました。 +// ランタイム バージョン: 15.0.0.0 +// +// このファイルへの変更は、正しくない動作の原因になる可能性があり、 +// コードが再生成されると失われます。 +// +// ------------------------------------------------------------------------------ +namespace MessagePack.CodeGenerator.Generator +{ + using System.Linq; + using System.Text; + using System.Collections.Generic; + using System; + + /// + /// Class to produce the template output + /// + + #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public partial class FormatterTemplate : FormatterTemplateBase + { +#line hidden + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); + + #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); + + #line default + #line hidden + this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n"); + + #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + foreach(var objInfo in objectSerializationInfos) { + + #line default + #line hidden + this.Write("\r\n public sealed class "); + + #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name)); + + #line default + #line hidden + this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); + + #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); + + #line default + #line hidden + this.Write(">\r\n {\r\n"); + + #line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if( objInfo.IsStringKey) { + + #line default + #line hidden + this.Write("\r\n readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping" + + ";\r\n readonly byte[][] ____stringByteKeys;\r\n\r\n public "); + + #line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name)); + + #line default + #line hidden + this.Write("Formatter()\r\n {\r\n this.____keyMapping = new global::MessagePack" + + ".Internal.AutomataDictionary()\r\n {\r\n"); + + #line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + foreach(var x in objInfo.Members) { + + #line default + #line hidden + this.Write(" { \""); + + #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey)); + + #line default + #line hidden + this.Write("\", "); + + #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); + + #line default + #line hidden + this.Write("},\r\n"); + + #line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" };\r\n\r\n this.____stringByteKeys = new byte[][]\r\n " + + " {\r\n"); + + #line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + foreach(var x in objInfo.Members.Where(x => x.IsReadable)) { + + #line default + #line hidden + this.Write(" global::MessagePack.MessagePackBinary.GetEncodedStringBytes(\""); + + #line 37 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey)); + + #line default + #line hidden + this.Write("\"),\r\n"); + + #line 38 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" \r\n };\r\n }\r\n\r\n"); + + #line 42 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write("\r\n public int Serialize(ref byte[] bytes, int offset, "); + + #line 44 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); + + #line default + #line hidden + this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n"); + + #line 46 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if( objInfo.IsClass) { + + #line default + #line hidden + this.Write(" if (value == null)\r\n {\r\n return global::Mes" + + "sagePack.MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n"); + + #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" \r\n"); + + #line 52 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" +if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore) { + + #line default + #line hidden + this.Write(" ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(" + + ");\r\n"); + + #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { + + #line default + #line hidden + this.Write(" value.OnBeforeSerialize();\r\n"); + + #line 56 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" var startOffset = offset;\r\n"); + + #line 58 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if( objInfo.IsIntKey) { if( (objInfo.MaxKey + 1) <= 15) { + + #line default + #line hidden + this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeader" + + "Unsafe(ref bytes, offset, "); + + #line 59 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1)); + + #line default + #line hidden + this.Write(");\r\n"); + + #line 60 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else { + + #line default + #line hidden + this.Write(" offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref " + + "bytes, offset, "); + + #line 61 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1)); + + #line default + #line hidden + this.Write(");\r\n"); + + #line 62 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } } else if( objInfo.WriteCount <= 15) { + + #line default + #line hidden + this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUn" + + "safe(ref bytes, offset, "); + + #line 63 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount)); + + #line default + #line hidden + this.Write(");\r\n"); + + #line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else { + + #line default + #line hidden + this.Write(" offset += global::MessagePack.MessagePackBinary.WriteMapHeader(ref by" + + "tes, offset, "); + + #line 65 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount)); + + #line default + #line hidden + this.Write(");\r\n"); + + #line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + + #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if(objInfo.IsIntKey) { + + #line default + #line hidden + + #line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + for(var i =0; i<= objInfo.MaxKey; i++) { var member = objInfo.GetMember(i); + + #line default + #line hidden + + #line 69 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if( member == null) { + + #line default + #line hidden + this.Write(" offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, o" + + "ffset);\r\n"); + + #line 71 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else { + + #line default + #line hidden + this.Write(" offset += "); + + #line 72 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString())); + + #line default + #line hidden + this.Write(";\r\n"); + + #line 73 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } } } else { + + #line default + #line hidden + + #line 74 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + var index = 0; foreach(var x in objInfo.Members) { + + #line default + #line hidden + this.Write(" offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, o" + + "ffset, this.____stringByteKeys["); + + #line 75 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(index++)); + + #line default + #line hidden + this.Write("]);\r\n offset += "); + + #line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.GetSerializeMethodString())); + + #line default + #line hidden + this.Write(";\r\n"); + + #line 77 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } } + + #line default + #line hidden + this.Write(" return offset - startOffset;\r\n }\r\n\r\n public "); + + #line 81 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); + + #line default + #line hidden + this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" + + "matterResolver, out int readSize)\r\n {\r\n if (global::MessagePac" + + "k.MessagePackBinary.IsNil(bytes, offset))\r\n {\r\n"); + + #line 85 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if( objInfo.IsClass) { + + #line default + #line hidden + this.Write(" readSize = 1;\r\n return null;\r\n"); + + #line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else { + + #line default + #line hidden + this.Write(" throw new InvalidOperationException(\"typecode is null, struct not" + + " supported\");\r\n"); + + #line 90 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" }\r\n\r\n var startOffset = offset;\r\n"); + + #line 94 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if(objInfo.IsStringKey) { + + #line default + #line hidden + this.Write(" var length = global::MessagePack.MessagePackBinary.ReadMapHeader(byte" + + "s, offset, out readSize);\r\n"); + + #line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else { + + #line default + #line hidden + this.Write(" var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(by" + + "tes, offset, out readSize);\r\n"); + + #line 98 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" offset += readSize;\r\n\r\n"); + + #line 101 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + foreach(var x in objInfo.Members) { + + #line default + #line hidden + this.Write(" var __"); + + #line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); + + #line default + #line hidden + this.Write("__ = default("); + + #line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.Type)); + + #line default + #line hidden + this.Write(");\r\n"); + + #line 103 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write("\r\n for (int i = 0; i < length; i++)\r\n {\r\n"); + + #line 107 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if(objInfo.IsStringKey) { + + #line default + #line hidden + this.Write(@" var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + goto NEXT_LOOP; + } +"); + + #line 116 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else { + + #line default + #line hidden + this.Write(" var key = i;\r\n"); + + #line 118 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write("\r\n switch (key)\r\n {\r\n"); + + #line 122 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + foreach(var x in objInfo.Members) { + + #line default + #line hidden + this.Write(" case "); + + #line 123 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); + + #line default + #line hidden + this.Write(":\r\n __"); + + #line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); + + #line default + #line hidden + this.Write("__ = "); + + #line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.GetDeserializeMethodString())); + + #line default + #line hidden + this.Write(";\r\n break;\r\n"); + + #line 126 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" default:\r\n readSize = global::MessageP" + + "ack.MessagePackBinary.ReadNextBlock(bytes, offset);\r\n bre" + + "ak;\r\n }\r\n"); + + #line 131 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + if(objInfo.IsStringKey) { + + #line default + #line hidden + this.Write(" \r\n NEXT_LOOP:\r\n"); + + #line 133 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" offset += readSize;\r\n }\r\n\r\n readSize = offs" + + "et - startOffset;\r\n\r\n var ____result = new "); + + #line 139 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString())); + + #line default + #line hidden + this.Write(";\r\n"); + + #line 140 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { + + #line default + #line hidden + this.Write(" ____result."); + + #line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); + + #line default + #line hidden + this.Write(" = __"); + + #line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); + + #line default + #line hidden + this.Write("__;\r\n"); + + #line 142 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + + #line 143 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" +if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { + + #line default + #line hidden + this.Write(" ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeseri" + + "alize();\r\n"); + + #line 145 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { + + #line default + #line hidden + this.Write(" ____result.OnAfterDeserialize();\r\n"); + + #line 147 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write(" return ____result;\r\n }\r\n }\r\n\r\n"); + + #line 152 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + } + + #line default + #line hidden + this.Write("}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning re" + + "store 618\r\n#pragma warning restore 612"); + return this.GenerationEnvironment.ToString(); + } + } + + #line default + #line hidden + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public class FormatterTemplateBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + protected System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs new file mode 100644 index 000000000..0e7d5d821 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs @@ -0,0 +1,455 @@ +// ------------------------------------------------------------------------------ +// +// このコードはツールによって生成されました。 +// ランタイム バージョン: 15.0.0.0 +// +// このファイルへの変更は、正しくない動作の原因になる可能性があり、 +// コードが再生成されると失われます。 +// +// ------------------------------------------------------------------------------ +namespace MessagePack.CodeGenerator.Generator +{ + using System.Linq; + using System.Text; + using System.Collections.Generic; + using System; + + /// + /// Class to produce the template output + /// + + #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public partial class ResolverTemplate : ResolverTemplateBase + { +#line hidden + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); + + #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); + + #line default + #line hidden + this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n public class "); + + #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); + + #line default + #line hidden + this.Write(" : global::MessagePack.IFormatterResolver\r\n {\r\n public static readonly " + + "global::MessagePack.IFormatterResolver Instance = new "); + + #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); + + #line default + #line hidden + this.Write("();\r\n\r\n "); + + #line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); + + #line default + #line hidden + this.Write(@"() + { + + } + + public global::MessagePack.Formatters.IMessagePackFormatter GetFormatter() + { + return FormatterCache.formatter; + } + + static class FormatterCache + { + public static readonly global::MessagePack.Formatters.IMessagePackFormatter formatter; + + static FormatterCache() + { + var f = "); + + #line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); + + #line default + #line hidden + this.Write(@"GetFormatterHelper.GetFormatter(typeof(T)); + if (f != null) + { + formatter = (global::MessagePack.Formatters.IMessagePackFormatter)f; + } + } + } + } + + internal static class "); + + #line 45 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); + + #line default + #line hidden + this.Write("GetFormatterHelper\r\n {\r\n static readonly global::System.Collections.Gen" + + "eric.Dictionary lookup;\r\n\r\n static "); + + #line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); + + #line default + #line hidden + this.Write("GetFormatterHelper()\r\n {\r\n lookup = new global::System.Collecti" + + "ons.Generic.Dictionary("); + + #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(registerInfos.Length)); + + #line default + #line hidden + this.Write(")\r\n {\r\n"); + + #line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; + + #line default + #line hidden + this.Write(" {typeof("); + + #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.FullName)); + + #line default + #line hidden + this.Write("), "); + + #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(i)); + + #line default + #line hidden + this.Write(" },\r\n"); + + #line 55 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + } + + #line default + #line hidden + this.Write(" };\r\n }\r\n\r\n internal static object GetFormatter(Type t)\r" + + "\n {\r\n int key;\r\n if (!lookup.TryGetValue(t, out key" + + ")) return null;\r\n\r\n switch (key)\r\n {\r\n"); + + #line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; + + #line default + #line hidden + this.Write(" case "); + + #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(i)); + + #line default + #line hidden + this.Write(": return new "); + + #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(x.FormatterName.StartsWith("global::") ? x.FormatterName: (!string.IsNullOrEmpty(FormatterNamespace) ? FormatterNamespace + "." : FormatterNamespace) + x.FormatterName)); + + #line default + #line hidden + this.Write("();\r\n"); + + #line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + } + + #line default + #line hidden + this.Write(" default: return null;\r\n }\r\n }\r\n }\r\n}\r\n\r\n#pra" + + "gma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning restore 61" + + "8\r\n#pragma warning restore 612"); + return this.GenerationEnvironment.ToString(); + } + } + + #line default + #line hidden + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public class ResolverTemplateBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + protected System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/TemplatePartials.cs b/src/MessagePack.UniversalCodeGenerator/Generator/TemplatePartials.cs new file mode 100644 index 000000000..03d60a203 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/TemplatePartials.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MessagePack.CodeGenerator.Generator +{ + public partial class FormatterTemplate + { + public string Namespace; + public ObjectSerializationInfo[] objectSerializationInfos; + } + + public partial class ResolverTemplate + { + public string Namespace; + public string FormatterNamespace { get; set; } + public string ResolverName = "GeneratedResolver"; + public IResolverRegisterInfo[] registerInfos; + } + public partial class EnumTemplate + { + public string Namespace; + public EnumSerializationInfo[] enumSerializationInfos; + } + + public partial class UnionTemplate + { + public string Namespace; + public UnionSerializationInfo[] unionSerializationInfos; + } +} diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs new file mode 100644 index 000000000..9b29e9012 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs @@ -0,0 +1,584 @@ +// ------------------------------------------------------------------------------ +// +// このコードはツールによって生成されました。 +// ランタイム バージョン: 15.0.0.0 +// +// このファイルへの変更は、正しくない動作の原因になる可能性があり、 +// コードが再生成されると失われます。 +// +// ------------------------------------------------------------------------------ +namespace MessagePack.CodeGenerator.Generator +{ + using System.Linq; + using System.Text; + using System.Collections.Generic; + using System; + + /// + /// Class to produce the template output + /// + + #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public partial class UnionTemplate : UnionTemplateBase + { +#line hidden + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); + + #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); + + #line default + #line hidden + this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using MessageP" + + "ack;\r\n\r\n"); + + #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + foreach(var info in unionSerializationInfos) { + + #line default + #line hidden + this.Write(" public sealed class "); + + #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); + + #line default + #line hidden + this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); + + #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(">\r\n {\r\n readonly Dictionary> " + + "typeToKeyAndJumpMap;\r\n readonly Dictionary keyToJumpMap;\r\n\r\n " + + " public "); + + #line 23 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); + + #line default + #line hidden + this.Write("Formatter()\r\n {\r\n this.typeToKeyAndJumpMap = new Dictionary>("); + + #line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length)); + + #line default + #line hidden + this.Write(", global::MessagePack.Internal.RuntimeTypeHandleEqualityComparer.Default)\r\n " + + " {\r\n"); + + #line 27 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; + + #line default + #line hidden + this.Write(" { typeof("); + + #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); + + #line default + #line hidden + this.Write(").TypeHandle, new KeyValuePair("); + + #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(item.Key)); + + #line default + #line hidden + this.Write(", "); + + #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(i)); + + #line default + #line hidden + this.Write(") },\r\n"); + + #line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + } + + #line default + #line hidden + this.Write(" };\r\n this.keyToJumpMap = new Dictionary("); + + #line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length)); + + #line default + #line hidden + this.Write(")\r\n {\r\n"); + + #line 33 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; + + #line default + #line hidden + this.Write(" { "); + + #line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(item.Key)); + + #line default + #line hidden + this.Write(", "); + + #line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(i)); + + #line default + #line hidden + this.Write(" },\r\n"); + + #line 35 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + } + + #line default + #line hidden + this.Write(" };\r\n }\r\n\r\n public int Serialize(ref byte[] bytes, int o" + + "ffset, "); + + #line 39 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(@" value, global::MessagePack.IFormatterResolver formatterResolver) + { + KeyValuePair keyValuePair; + if (value != null && this.typeToKeyAndJumpMap.TryGetValue(value.GetType().TypeHandle, out keyValuePair)) + { + var startOffset = offset; + offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); + offset += MessagePackBinary.WriteInt32(ref bytes, offset, keyValuePair.Key); + switch (keyValuePair.Value) + { +"); + + #line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; + + #line default + #line hidden + this.Write(" case "); + + #line 50 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(i)); + + #line default + #line hidden + this.Write(":\r\n offset += formatterResolver.GetFormatterWithVerify<"); + + #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); + + #line default + #line hidden + this.Write(">().Serialize(ref bytes, offset, ("); + + #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); + + #line default + #line hidden + this.Write(")value, formatterResolver);\r\n break;\r\n"); + + #line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + } + + #line default + #line hidden + this.Write(" default:\r\n break;\r\n }\r\n" + + "\r\n return offset - startOffset;\r\n }\r\n\r\n ret" + + "urn MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n \r\n " + + " public "); + + #line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(@" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) + { + if (MessagePackBinary.IsNil(bytes, offset)) + { + readSize = 1; + return null; + } + + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException(""Invalid Union data was detected. Type:"); + + #line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(@"""); + } + offset += readSize; + + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; + + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } + + "); + + #line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(" result = null;\r\n switch (key)\r\n {\r\n"); + + #line 91 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; + + #line default + #line hidden + this.Write(" case "); + + #line 92 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(i)); + + #line default + #line hidden + this.Write(":\r\n result = ("); + + #line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); + + #line default + #line hidden + this.Write(")formatterResolver.GetFormatterWithVerify<"); + + #line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); + + #line default + #line hidden + this.Write(">().Deserialize(bytes, offset, formatterResolver, out readSize);\r\n " + + " offset += readSize;\r\n break;\r\n"); + + #line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + } + + #line default + #line hidden + this.Write(@" default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + + readSize = offset - startOffset; + + return result; + } + } + +"); + + #line 108 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + } + + #line default + #line hidden + this.Write("\r\n}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning " + + "restore 618\r\n#pragma warning restore 612"); + return this.GenerationEnvironment.ToString(); + } + } + + #line default + #line hidden + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + public class UnionTemplateBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + protected System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj new file mode 100644 index 000000000..bdf2cf937 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.1 + + + + + + + diff --git a/src/MessagePack.UniversalCodeGenerator/Mono.Options/Options.cs b/src/MessagePack.UniversalCodeGenerator/Mono.Options/Options.cs new file mode 100644 index 000000000..486b3ca8f --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Mono.Options/Options.cs @@ -0,0 +1,1463 @@ +// +// Options.cs +// +// Authors: +// Jonathan Pryor +// Federico Di Gregorio +// Rolf Bjarne Kvinge +// +// Copyright (C) 2008 Novell (http://www.novell.com) +// Copyright (C) 2009 Federico Di Gregorio. +// Copyright (C) 2012 Xamarin Inc (http://www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +// Compile With: +// gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll +// gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll +// +// The LINQ version just changes the implementation of +// OptionSet.Parse(IEnumerable), and confers no semantic changes. + +// +// A Getopt::Long-inspired option parsing library for C#. +// +// NDesk.Options.OptionSet is built upon a key/value table, where the +// key is a option format string and the value is a delegate that is +// invoked when the format string is matched. +// +// Option format strings: +// Regex-like BNF Grammar: +// name: .+ +// type: [=:] +// sep: ( [^{}]+ | '{' .+ '}' )? +// aliases: ( name type sep ) ( '|' name type sep )* +// +// Each '|'-delimited name is an alias for the associated action. If the +// format string ends in a '=', it has a required value. If the format +// string ends in a ':', it has an optional value. If neither '=' or ':' +// is present, no value is supported. `=' or `:' need only be defined on one +// alias, but if they are provided on more than one they must be consistent. +// +// Each alias portion may also end with a "key/value separator", which is used +// to split option values if the option accepts > 1 value. If not specified, +// it defaults to '=' and ':'. If specified, it can be any character except +// '{' and '}' OR the *string* between '{' and '}'. If no separator should be +// used (i.e. the separate values should be distinct arguments), then "{}" +// should be used as the separator. +// +// Options are extracted either from the current option by looking for +// the option name followed by an '=' or ':', or is taken from the +// following option IFF: +// - The current option does not contain a '=' or a ':' +// - The current option requires a value (i.e. not a Option type of ':') +// +// The `name' used in the option format string does NOT include any leading +// option indicator, such as '-', '--', or '/'. All three of these are +// permitted/required on any named option. +// +// Option bundling is permitted so long as: +// - '-' is used to start the option group +// - all of the bundled options are a single character +// - at most one of the bundled options accepts a value, and the value +// provided starts from the next character to the end of the string. +// +// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' +// as '-Dname=value'. +// +// Option processing is disabled by specifying "--". All options after "--" +// are returned by OptionSet.Parse() unchanged and unprocessed. +// +// Unprocessed options are returned from OptionSet.Parse(). +// +// Examples: +// int verbose = 0; +// OptionSet p = new OptionSet () +// .Add ("v", v => ++verbose) +// .Add ("name=|value=", v => Console.WriteLine (v)); +// p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); +// +// The above would parse the argument string array, and would invoke the +// lambda expression three times, setting `verbose' to 3 when complete. +// It would also print out "A" and "B" to standard output. +// The returned array would contain the string "extra". +// +// C# 3.0 collection initializers are supported and encouraged: +// var p = new OptionSet () { +// { "h|?|help", v => ShowHelp () }, +// }; +// +// System.ComponentModel.TypeConverter is also supported, allowing the use of +// custom data types in the callback type; TypeConverter.ConvertFromString() +// is used to convert the value option to an instance of the specified +// type: +// +// var p = new OptionSet () { +// { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, +// }; +// +// Random other tidbits: +// - Boolean options (those w/o '=' or ':' in the option format string) +// are explicitly enabled if they are followed with '+', and explicitly +// disabled if they are followed with '-': +// string a = null; +// var p = new OptionSet () { +// { "a", s => a = s }, +// }; +// p.Parse (new string[]{"-a"}); // sets v != null +// p.Parse (new string[]{"-a+"}); // sets v != null +// p.Parse (new string[]{"-a-"}); // sets v == null +// + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Runtime.Serialization; +using System.Security.Permissions; +using System.Text; +using System.Text.RegularExpressions; + +#if LINQ +using System.Linq; +#endif + +#if TEST +using NDesk.Options; +#endif + +#if NDESK_OPTIONS +namespace NDesk.Options +#else +namespace Mono.Options +#endif +{ + static class StringCoda + { + + public static IEnumerable WrappedLines(string self, params int[] widths) + { + IEnumerable w = widths; + return WrappedLines(self, w); + } + + public static IEnumerable WrappedLines(string self, IEnumerable widths) + { + if (widths == null) + throw new ArgumentNullException("widths"); + return CreateWrappedLinesIterator(self, widths); + } + + private static IEnumerable CreateWrappedLinesIterator(string self, IEnumerable widths) + { + if (string.IsNullOrEmpty(self)) + { + yield return string.Empty; + yield break; + } + using (IEnumerator ewidths = widths.GetEnumerator()) + { + bool? hw = null; + int width = GetNextWidth(ewidths, int.MaxValue, ref hw); + int start = 0, end; + do + { + end = GetLineEnd(start, width, self); + char c = self[end - 1]; + if (char.IsWhiteSpace(c)) + --end; + bool needContinuation = end != self.Length && !IsEolChar(c); + string continuation = ""; + if (needContinuation) + { + --end; + continuation = "-"; + } + string line = self.Substring(start, end - start) + continuation; + yield return line; + start = end; + if (char.IsWhiteSpace(c)) + ++start; + width = GetNextWidth(ewidths, width, ref hw); + } while (start < self.Length); + } + } + + private static int GetNextWidth(IEnumerator ewidths, int curWidth, ref bool? eValid) + { + if (!eValid.HasValue || (eValid.HasValue && eValid.Value)) + { + curWidth = (eValid = ewidths.MoveNext()).Value ? ewidths.Current : curWidth; + // '.' is any character, - is for a continuation + const string minWidth = ".-"; + if (curWidth < minWidth.Length) + throw new ArgumentOutOfRangeException("widths", + string.Format("Element must be >= {0}, was {1}.", minWidth.Length, curWidth)); + return curWidth; + } + // no more elements, use the last element. + return curWidth; + } + + private static bool IsEolChar(char c) + { + return !char.IsLetterOrDigit(c); + } + + private static int GetLineEnd(int start, int length, string description) + { + int end = System.Math.Min(start + length, description.Length); + int sep = -1; + for (int i = start; i < end; ++i) + { + if (description[i] == '\n') + return i + 1; + if (IsEolChar(description[i])) + sep = i + 1; + } + if (sep == -1 || end == description.Length) + return end; + return sep; + } + } + + public class OptionValueCollection : IList, IList + { + + List values = new List(); + OptionContext c; + + internal OptionValueCollection(OptionContext c) + { + this.c = c; + } + + #region ICollection + void ICollection.CopyTo(Array array, int index) { (values as ICollection).CopyTo(array, index); } + bool ICollection.IsSynchronized { get { return (values as ICollection).IsSynchronized; } } + object ICollection.SyncRoot { get { return (values as ICollection).SyncRoot; } } + #endregion + + #region ICollection + public void Add(string item) { values.Add(item); } + public void Clear() { values.Clear(); } + public bool Contains(string item) { return values.Contains(item); } + public void CopyTo(string[] array, int arrayIndex) { values.CopyTo(array, arrayIndex); } + public bool Remove(string item) { return values.Remove(item); } + public int Count { get { return values.Count; } } + public bool IsReadOnly { get { return false; } } + #endregion + + #region IEnumerable + IEnumerator IEnumerable.GetEnumerator() { return values.GetEnumerator(); } + #endregion + + #region IEnumerable + public IEnumerator GetEnumerator() { return values.GetEnumerator(); } + #endregion + + #region IList + int IList.Add(object value) { return (values as IList).Add(value); } + bool IList.Contains(object value) { return (values as IList).Contains(value); } + int IList.IndexOf(object value) { return (values as IList).IndexOf(value); } + void IList.Insert(int index, object value) { (values as IList).Insert(index, value); } + void IList.Remove(object value) { (values as IList).Remove(value); } + void IList.RemoveAt(int index) { (values as IList).RemoveAt(index); } + bool IList.IsFixedSize { get { return false; } } + object IList.this[int index] { get { return this[index]; } set { (values as IList)[index] = value; } } + #endregion + + #region IList + public int IndexOf(string item) { return values.IndexOf(item); } + public void Insert(int index, string item) { values.Insert(index, item); } + public void RemoveAt(int index) { values.RemoveAt(index); } + + private void AssertValid(int index) + { + if (c.Option == null) + throw new InvalidOperationException("OptionContext.Option is null."); + if (index >= c.Option.MaxValueCount) + throw new ArgumentOutOfRangeException("index"); + if (c.Option.OptionValueType == OptionValueType.Required && + index >= values.Count) + throw new OptionException(string.Format( + c.OptionSet.MessageLocalizer("Missing required value for option '{0}'."), c.OptionName), + c.OptionName); + } + + public string this[int index] + { + get + { + AssertValid(index); + return index >= values.Count ? null : values[index]; + } + set + { + values[index] = value; + } + } + #endregion + + public List ToList() + { + return new List(values); + } + + public string[] ToArray() + { + return values.ToArray(); + } + + public override string ToString() + { + return string.Join(", ", values.ToArray()); + } + } + + public class OptionContext + { + private Option option; + private string name; + private int index; + private OptionSet set; + private OptionValueCollection c; + + public OptionContext(OptionSet set) + { + this.set = set; + this.c = new OptionValueCollection(this); + } + + public Option Option + { + get { return option; } + set { option = value; } + } + + public string OptionName + { + get { return name; } + set { name = value; } + } + + public int OptionIndex + { + get { return index; } + set { index = value; } + } + + public OptionSet OptionSet + { + get { return set; } + } + + public OptionValueCollection OptionValues + { + get { return c; } + } + } + + public enum OptionValueType + { + None, + Optional, + Required, + } + + public abstract class Option + { + string prototype, description; + string[] names; + OptionValueType type; + int count; + string[] separators; + bool hidden; + + protected Option(string prototype, string description) + : this(prototype, description, 1, false) + { + } + + protected Option(string prototype, string description, int maxValueCount) + : this(prototype, description, maxValueCount, false) + { + } + + protected Option(string prototype, string description, int maxValueCount, bool hidden) + { + if (prototype == null) + throw new ArgumentNullException("prototype"); + if (prototype.Length == 0) + throw new ArgumentException("Cannot be the empty string.", "prototype"); + if (maxValueCount < 0) + throw new ArgumentOutOfRangeException("maxValueCount"); + + this.prototype = prototype; + this.description = description; + this.count = maxValueCount; + this.names = (this is OptionSet.Category) + // append GetHashCode() so that "duplicate" categories have distinct + // names, e.g. adding multiple "" categories should be valid. + ? new[] { prototype + this.GetHashCode() } + : prototype.Split('|'); + + if (this is OptionSet.Category) + return; + + this.type = ParsePrototype(); + this.hidden = hidden; + + if (this.count == 0 && type != OptionValueType.None) + throw new ArgumentException( + "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + + "OptionValueType.Optional.", + "maxValueCount"); + if (this.type == OptionValueType.None && maxValueCount > 1) + throw new ArgumentException( + string.Format("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), + "maxValueCount"); + if (Array.IndexOf(names, "<>") >= 0 && + ((names.Length == 1 && this.type != OptionValueType.None) || + (names.Length > 1 && this.MaxValueCount > 1))) + throw new ArgumentException( + "The default option handler '<>' cannot require values.", + "prototype"); + } + + public string Prototype { get { return prototype; } } + public string Description { get { return description; } } + public OptionValueType OptionValueType { get { return type; } } + public int MaxValueCount { get { return count; } } + public bool Hidden { get { return hidden; } } + + public string[] GetNames() + { + return (string[])names.Clone(); + } + + public string[] GetValueSeparators() + { + if (separators == null) + return new string[0]; + return (string[])separators.Clone(); + } + + protected static T Parse(string value, OptionContext c) + { + Type tt = typeof(T); + bool nullable = tt.IsValueType && tt.IsGenericType && + !tt.IsGenericTypeDefinition && + tt.GetGenericTypeDefinition() == typeof(Nullable<>); + Type targetType = nullable ? tt.GetGenericArguments()[0] : typeof(T); + TypeConverter conv = TypeDescriptor.GetConverter(targetType); + T t = default(T); + try + { + if (value != null) + t = (T)conv.ConvertFromString(value); + } + catch (Exception e) + { + throw new OptionException( + string.Format( + c.OptionSet.MessageLocalizer("Could not convert string `{0}' to type {1} for option `{2}'."), + value, targetType.Name, c.OptionName), + c.OptionName, e); + } + return t; + } + + internal string[] Names { get { return names; } } + internal string[] ValueSeparators { get { return separators; } } + + static readonly char[] NameTerminator = new char[] { '=', ':' }; + + private OptionValueType ParsePrototype() + { + char type = '\0'; + List seps = new List(); + for (int i = 0; i < names.Length; ++i) + { + string name = names[i]; + if (name.Length == 0) + throw new ArgumentException("Empty option names are not supported.", "prototype"); + + int end = name.IndexOfAny(NameTerminator); + if (end == -1) + continue; + names[i] = name.Substring(0, end); + if (type == '\0' || type == name[end]) + type = name[end]; + else + throw new ArgumentException( + string.Format("Conflicting option types: '{0}' vs. '{1}'.", type, name[end]), + "prototype"); + AddSeparators(name, end, seps); + } + + if (type == '\0') + return OptionValueType.None; + + if (count <= 1 && seps.Count != 0) + throw new ArgumentException( + string.Format("Cannot provide key/value separators for Options taking {0} value(s).", count), + "prototype"); + if (count > 1) + { + if (seps.Count == 0) + this.separators = new string[] { ":", "=" }; + else if (seps.Count == 1 && seps[0].Length == 0) + this.separators = null; + else + this.separators = seps.ToArray(); + } + + return type == '=' ? OptionValueType.Required : OptionValueType.Optional; + } + + private static void AddSeparators(string name, int end, ICollection seps) + { + int start = -1; + for (int i = end + 1; i < name.Length; ++i) + { + switch (name[i]) + { + case '{': + if (start != -1) + throw new ArgumentException( + string.Format("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + start = i + 1; + break; + case '}': + if (start == -1) + throw new ArgumentException( + string.Format("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + seps.Add(name.Substring(start, i - start)); + start = -1; + break; + default: + if (start == -1) + seps.Add(name[i].ToString()); + break; + } + } + if (start != -1) + throw new ArgumentException( + string.Format("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + } + + public void Invoke(OptionContext c) + { + OnParseComplete(c); + c.OptionName = null; + c.Option = null; + c.OptionValues.Clear(); + } + + protected abstract void OnParseComplete(OptionContext c); + + public override string ToString() + { + return Prototype; + } + } + + public abstract class ArgumentSource + { + + protected ArgumentSource() + { + } + + public abstract string[] GetNames(); + public abstract string Description { get; } + public abstract bool GetArguments(string value, out IEnumerable replacement); + + public static IEnumerable GetArgumentsFromFile(string file) + { + return GetArguments(File.OpenText(file), true); + } + + public static IEnumerable GetArguments(TextReader reader) + { + return GetArguments(reader, false); + } + + // Cribbed from mcs/driver.cs:LoadArgs(string) + static IEnumerable GetArguments(TextReader reader, bool close) + { + try + { + StringBuilder arg = new StringBuilder(); + + string line; + while ((line = reader.ReadLine()) != null) + { + int t = line.Length; + + for (int i = 0; i < t; i++) + { + char c = line[i]; + + if (c == '"' || c == '\'') + { + char end = c; + + for (i++; i < t; i++) + { + c = line[i]; + + if (c == end) + break; + arg.Append(c); + } + } + else if (c == ' ') + { + if (arg.Length > 0) + { + yield return arg.ToString(); + arg.Length = 0; + } + } + else + arg.Append(c); + } + if (arg.Length > 0) + { + yield return arg.ToString(); + arg.Length = 0; + } + } + } + finally + { + if (close) + reader.Close(); + } + } + } + + public class ResponseFileSource : ArgumentSource + { + + public override string[] GetNames() + { + return new string[] { "@file" }; + } + + public override string Description + { + get { return "Read response file for more options."; } + } + + public override bool GetArguments(string value, out IEnumerable replacement) + { + if (string.IsNullOrEmpty(value) || !value.StartsWith("@")) + { + replacement = null; + return false; + } + replacement = ArgumentSource.GetArgumentsFromFile(value.Substring(1)); + return true; + } + } + + [Serializable] + public class OptionException : Exception + { + private string option; + + public OptionException() + { + } + + public OptionException(string message, string optionName) + : base(message) + { + this.option = optionName; + } + + public OptionException(string message, string optionName, Exception innerException) + : base(message, innerException) + { + this.option = optionName; + } + + protected OptionException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + this.option = info.GetString("OptionName"); + } + + public string OptionName + { + get { return this.option; } + } + + [SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + base.GetObjectData(info, context); + info.AddValue("OptionName", option); + } + } + + public delegate void OptionAction(TKey key, TValue value); + + public class OptionSet : KeyedCollection + { + public OptionSet() + : this(delegate (string f) { return f; }) + { + } + + public OptionSet(Converter localizer) + { + this.localizer = localizer; + this.roSources = new ReadOnlyCollection(sources); + } + + Converter localizer; + + public Converter MessageLocalizer + { + get { return localizer; } + } + + List sources = new List(); + ReadOnlyCollection roSources; + + public ReadOnlyCollection ArgumentSources + { + get { return roSources; } + } + + + protected override string GetKeyForItem(Option item) + { + if (item == null) + throw new ArgumentNullException("option"); + if (item.Names != null && item.Names.Length > 0) + return item.Names[0]; + // This should never happen, as it's invalid for Option to be + // constructed w/o any names. + throw new InvalidOperationException("Option has no names!"); + } + + [Obsolete("Use KeyedCollection.this[string]")] + protected Option GetOptionForName(string option) + { + if (option == null) + throw new ArgumentNullException("option"); + try + { + return base[option]; + } + catch (KeyNotFoundException) + { + return null; + } + } + + protected override void InsertItem(int index, Option item) + { + base.InsertItem(index, item); + AddImpl(item); + } + + protected override void RemoveItem(int index) + { + Option p = Items[index]; + base.RemoveItem(index); + // KeyedCollection.RemoveItem() handles the 0th item + for (int i = 1; i < p.Names.Length; ++i) + { + Dictionary.Remove(p.Names[i]); + } + } + + protected override void SetItem(int index, Option item) + { + base.SetItem(index, item); + AddImpl(item); + } + + private void AddImpl(Option option) + { + if (option == null) + throw new ArgumentNullException("option"); + List added = new List(option.Names.Length); + try + { + // KeyedCollection.InsertItem/SetItem handle the 0th name. + for (int i = 1; i < option.Names.Length; ++i) + { + Dictionary.Add(option.Names[i], option); + added.Add(option.Names[i]); + } + } + catch (Exception) + { + foreach (string name in added) + Dictionary.Remove(name); + throw; + } + } + + public OptionSet Add(string header) + { + if (header == null) + throw new ArgumentNullException("header"); + Add(new Category(header)); + return this; + } + + internal sealed class Category : Option + { + + // Prototype starts with '=' because this is an invalid prototype + // (see Option.ParsePrototype(), and thus it'll prevent Category + // instances from being accidentally used as normal options. + public Category(string description) + : base("=:Category:= " + description, description) + { + } + + protected override void OnParseComplete(OptionContext c) + { + throw new NotSupportedException("Category.OnParseComplete should not be invoked."); + } + } + + + public new OptionSet Add(Option option) + { + base.Add(option); + return this; + } + + sealed class ActionOption : Option + { + Action action; + + public ActionOption(string prototype, string description, int count, Action action) + : this(prototype, description, count, action, false) + { + } + + public ActionOption(string prototype, string description, int count, Action action, bool hidden) + : base(prototype, description, count, hidden) + { + if (action == null) + throw new ArgumentNullException("action"); + this.action = action; + } + + protected override void OnParseComplete(OptionContext c) + { + action(c.OptionValues); + } + } + + public OptionSet Add(string prototype, Action action) + { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, Action action) + { + return Add(prototype, description, action, false); + } + + public OptionSet Add(string prototype, string description, Action action, bool hidden) + { + if (action == null) + throw new ArgumentNullException("action"); + Option p = new ActionOption(prototype, description, 1, + delegate (OptionValueCollection v) { action(v[0]); }, hidden); + base.Add(p); + return this; + } + + public OptionSet Add(string prototype, OptionAction action) + { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, OptionAction action) + { + return Add(prototype, description, action, false); + } + + public OptionSet Add(string prototype, string description, OptionAction action, bool hidden) + { + if (action == null) + throw new ArgumentNullException("action"); + Option p = new ActionOption(prototype, description, 2, + delegate (OptionValueCollection v) { action(v[0], v[1]); }, hidden); + base.Add(p); + return this; + } + + sealed class ActionOption : Option + { + Action action; + + public ActionOption(string prototype, string description, Action action) + : base(prototype, description, 1) + { + if (action == null) + throw new ArgumentNullException("action"); + this.action = action; + } + + protected override void OnParseComplete(OptionContext c) + { + action(Parse(c.OptionValues[0], c)); + } + } + + sealed class ActionOption : Option + { + OptionAction action; + + public ActionOption(string prototype, string description, OptionAction action) + : base(prototype, description, 2) + { + if (action == null) + throw new ArgumentNullException("action"); + this.action = action; + } + + protected override void OnParseComplete(OptionContext c) + { + action( + Parse(c.OptionValues[0], c), + Parse(c.OptionValues[1], c)); + } + } + + public OptionSet Add(string prototype, Action action) + { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, Action action) + { + return Add(new ActionOption(prototype, description, action)); + } + + public OptionSet Add(string prototype, OptionAction action) + { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, OptionAction action) + { + return Add(new ActionOption(prototype, description, action)); + } + + public OptionSet Add(ArgumentSource source) + { + if (source == null) + throw new ArgumentNullException("source"); + sources.Add(source); + return this; + } + + protected virtual OptionContext CreateOptionContext() + { + return new OptionContext(this); + } + + public List Parse(IEnumerable arguments) + { + if (arguments == null) + throw new ArgumentNullException("arguments"); + OptionContext c = CreateOptionContext(); + c.OptionIndex = -1; + bool process = true; + List unprocessed = new List(); + Option def = Contains("<>") ? this["<>"] : null; + ArgumentEnumerator ae = new ArgumentEnumerator(arguments); + foreach (string argument in ae) + { + ++c.OptionIndex; + if (argument == "--") + { + process = false; + continue; + } + if (!process) + { + Unprocessed(unprocessed, def, c, argument); + continue; + } + if (AddSource(ae, argument)) + continue; + if (!Parse(argument, c)) + Unprocessed(unprocessed, def, c, argument); + } + if (c.Option != null) + c.Option.Invoke(c); + return unprocessed; + } + + class ArgumentEnumerator : IEnumerable + { + List> sources = new List>(); + + public ArgumentEnumerator(IEnumerable arguments) + { + sources.Add(arguments.GetEnumerator()); + } + + public void Add(IEnumerable arguments) + { + sources.Add(arguments.GetEnumerator()); + } + + public IEnumerator GetEnumerator() + { + do + { + IEnumerator c = sources[sources.Count - 1]; + if (c.MoveNext()) + yield return c.Current; + else + { + c.Dispose(); + sources.RemoveAt(sources.Count - 1); + } + } while (sources.Count > 0); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + bool AddSource(ArgumentEnumerator ae, string argument) + { + foreach (ArgumentSource source in sources) + { + IEnumerable replacement; + if (!source.GetArguments(argument, out replacement)) + continue; + ae.Add(replacement); + return true; + } + return false; + } + + private static bool Unprocessed(ICollection extra, Option def, OptionContext c, string argument) + { + if (def == null) + { + extra.Add(argument); + return false; + } + c.OptionValues.Add(argument); + c.Option = def; + c.Option.Invoke(c); + return false; + } + + private readonly Regex ValueOption = new Regex( + @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); + + protected bool GetOptionParts(string argument, out string flag, out string name, out string sep, out string value) + { + if (argument == null) + throw new ArgumentNullException("argument"); + + flag = name = sep = value = null; + Match m = ValueOption.Match(argument); + if (!m.Success) + { + return false; + } + flag = m.Groups["flag"].Value; + name = m.Groups["name"].Value; + if (m.Groups["sep"].Success && m.Groups["value"].Success) + { + sep = m.Groups["sep"].Value; + value = m.Groups["value"].Value; + } + return true; + } + + protected virtual bool Parse(string argument, OptionContext c) + { + if (c.Option != null) + { + ParseValue(argument, c); + return true; + } + + string f, n, s, v; + if (!GetOptionParts(argument, out f, out n, out s, out v)) + return false; + + Option p; + if (Contains(n)) + { + p = this[n]; + c.OptionName = f + n; + c.Option = p; + switch (p.OptionValueType) + { + case OptionValueType.None: + c.OptionValues.Add(n); + c.Option.Invoke(c); + break; + case OptionValueType.Optional: + case OptionValueType.Required: + ParseValue(v, c); + break; + } + return true; + } + // no match; is it a bool option? + if (ParseBool(argument, n, c)) + return true; + // is it a bundled option? + if (ParseBundledValue(f, string.Concat(n + s + v), c)) + return true; + + return false; + } + + private void ParseValue(string option, OptionContext c) + { + if (option != null) + foreach (string o in c.Option.ValueSeparators != null + ? option.Split(c.Option.ValueSeparators, c.Option.MaxValueCount - c.OptionValues.Count, StringSplitOptions.None) + : new string[] { option }) + { + c.OptionValues.Add(o); + } + if (c.OptionValues.Count == c.Option.MaxValueCount || + c.Option.OptionValueType == OptionValueType.Optional) + c.Option.Invoke(c); + else if (c.OptionValues.Count > c.Option.MaxValueCount) + { + throw new OptionException(localizer(string.Format( + "Error: Found {0} option values when expecting {1}.", + c.OptionValues.Count, c.Option.MaxValueCount)), + c.OptionName); + } + } + + private bool ParseBool(string option, string n, OptionContext c) + { + Option p; + string rn; + if (n.Length >= 1 && (n[n.Length - 1] == '+' || n[n.Length - 1] == '-') && + Contains((rn = n.Substring(0, n.Length - 1)))) + { + p = this[rn]; + string v = n[n.Length - 1] == '+' ? option : null; + c.OptionName = option; + c.Option = p; + c.OptionValues.Add(v); + p.Invoke(c); + return true; + } + return false; + } + + private bool ParseBundledValue(string f, string n, OptionContext c) + { + if (f != "-") + return false; + for (int i = 0; i < n.Length; ++i) + { + Option p; + string opt = f + n[i].ToString(); + string rn = n[i].ToString(); + if (!Contains(rn)) + { + if (i == 0) + return false; + throw new OptionException(string.Format(localizer( + "Cannot bundle unregistered option '{0}'."), opt), opt); + } + p = this[rn]; + switch (p.OptionValueType) + { + case OptionValueType.None: + Invoke(c, opt, n, p); + break; + case OptionValueType.Optional: + case OptionValueType.Required: + { + string v = n.Substring(i + 1); + c.Option = p; + c.OptionName = opt; + ParseValue(v.Length != 0 ? v : null, c); + return true; + } + default: + throw new InvalidOperationException("Unknown OptionValueType: " + p.OptionValueType); + } + } + return true; + } + + private static void Invoke(OptionContext c, string name, string value, Option option) + { + c.OptionName = name; + c.Option = option; + c.OptionValues.Add(value); + option.Invoke(c); + } + + private const int OptionWidth = 29; + private const int Description_FirstWidth = 80 - OptionWidth; + private const int Description_RemWidth = 80 - OptionWidth - 2; + + public void WriteOptionDescriptions(TextWriter o) + { + foreach (Option p in this) + { + int written = 0; + + if (p.Hidden) + continue; + + Category c = p as Category; + if (c != null) + { + WriteDescription(o, p.Description, "", 80, 80); + continue; + } + + if (!WriteOptionPrototype(o, p, ref written)) + continue; + + if (written < OptionWidth) + o.Write(new string(' ', OptionWidth - written)); + else + { + o.WriteLine(); + o.Write(new string(' ', OptionWidth)); + } + + WriteDescription(o, p.Description, new string(' ', OptionWidth + 2), + Description_FirstWidth, Description_RemWidth); + } + + foreach (ArgumentSource s in sources) + { + string[] names = s.GetNames(); + if (names == null || names.Length == 0) + continue; + + int written = 0; + + Write(o, ref written, " "); + Write(o, ref written, names[0]); + for (int i = 1; i < names.Length; ++i) + { + Write(o, ref written, ", "); + Write(o, ref written, names[i]); + } + + if (written < OptionWidth) + o.Write(new string(' ', OptionWidth - written)); + else + { + o.WriteLine(); + o.Write(new string(' ', OptionWidth)); + } + + WriteDescription(o, s.Description, new string(' ', OptionWidth + 2), + Description_FirstWidth, Description_RemWidth); + } + } + + void WriteDescription(TextWriter o, string value, string prefix, int firstWidth, int remWidth) + { + bool indent = false; + foreach (string line in GetLines(localizer(GetDescription(value)), firstWidth, remWidth)) + { + if (indent) + o.Write(prefix); + o.WriteLine(line); + indent = true; + } + } + + bool WriteOptionPrototype(TextWriter o, Option p, ref int written) + { + string[] names = p.Names; + + int i = GetNextOptionIndex(names, 0); + if (i == names.Length) + return false; + + if (names[i].Length == 1) + { + Write(o, ref written, " -"); + Write(o, ref written, names[0]); + } + else + { + Write(o, ref written, " --"); + Write(o, ref written, names[0]); + } + + for (i = GetNextOptionIndex(names, i + 1); + i < names.Length; i = GetNextOptionIndex(names, i + 1)) + { + Write(o, ref written, ", "); + Write(o, ref written, names[i].Length == 1 ? "-" : "--"); + Write(o, ref written, names[i]); + } + + if (p.OptionValueType == OptionValueType.Optional || + p.OptionValueType == OptionValueType.Required) + { + if (p.OptionValueType == OptionValueType.Optional) + { + Write(o, ref written, localizer("[")); + } + Write(o, ref written, localizer("=" + GetArgumentName(0, p.MaxValueCount, p.Description))); + string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 + ? p.ValueSeparators[0] + : " "; + for (int c = 1; c < p.MaxValueCount; ++c) + { + Write(o, ref written, localizer(sep + GetArgumentName(c, p.MaxValueCount, p.Description))); + } + if (p.OptionValueType == OptionValueType.Optional) + { + Write(o, ref written, localizer("]")); + } + } + return true; + } + + static int GetNextOptionIndex(string[] names, int i) + { + while (i < names.Length && names[i] == "<>") + { + ++i; + } + return i; + } + + static void Write(TextWriter o, ref int n, string s) + { + n += s.Length; + o.Write(s); + } + + private static string GetArgumentName(int index, int maxIndex, string description) + { + if (description == null) + return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); + string[] nameStart; + if (maxIndex == 1) + nameStart = new string[] { "{0:", "{" }; + else + nameStart = new string[] { "{" + index + ":" }; + for (int i = 0; i < nameStart.Length; ++i) + { + int start, j = 0; + do + { + start = description.IndexOf(nameStart[i], j); + } while (start >= 0 && j != 0 ? description[j++ - 1] == '{' : false); + if (start == -1) + continue; + int end = description.IndexOf("}", start); + if (end == -1) + continue; + return description.Substring(start + nameStart[i].Length, end - start - nameStart[i].Length); + } + return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); + } + + private static string GetDescription(string description) + { + if (description == null) + return string.Empty; + StringBuilder sb = new StringBuilder(description.Length); + int start = -1; + for (int i = 0; i < description.Length; ++i) + { + switch (description[i]) + { + case '{': + if (i == start) + { + sb.Append('{'); + start = -1; + } + else if (start < 0) + start = i + 1; + break; + case '}': + if (start < 0) + { + if ((i + 1) == description.Length || description[i + 1] != '}') + throw new InvalidOperationException("Invalid option description: " + description); + ++i; + sb.Append("}"); + } + else + { + sb.Append(description.Substring(start, i - start)); + start = -1; + } + break; + case ':': + if (start < 0) + goto default; + start = i + 1; + break; + default: + if (start < 0) + sb.Append(description[i]); + break; + } + } + return sb.ToString(); + } + + private static IEnumerable GetLines(string description, int firstWidth, int remWidth) + { + return StringCoda.WrappedLines(description, firstWidth, remWidth); + } + } +} + diff --git a/src/MessagePack.UniversalCodeGenerator/Program.cs b/src/MessagePack.UniversalCodeGenerator/Program.cs new file mode 100644 index 000000000..c53d9b91e --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Program.cs @@ -0,0 +1,179 @@ +using MessagePack.CodeGenerator.Generator; +using Mono.Options; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MessagePack.CodeGenerator +{ + class CommandlineArguments + { + public string InputPath { get; private set; } + public string OutputPath { get; private set; } + public List ConditionalSymbols { get; private set; } + public string ResolverName { get; private set; } + public string NamespaceRoot { get; private set; } + public bool IsUseMap { get; private set; } + + public bool IsParsed { get; set; } + + public CommandlineArguments(string[] args) + { + ConditionalSymbols = new List(); + NamespaceRoot = "MessagePack"; + ResolverName = "GeneratedResolver"; + IsUseMap = false; + + var option = new OptionSet() + { + { "i|input=", "[required]Input path of analyze csproj", x => { InputPath = x; } }, + { "o|output=", "[required]Output file path", x => { OutputPath = x; } }, + { "c|conditionalsymbol=", "[optional, default=empty]conditional compiler symbol", x => { ConditionalSymbols.AddRange(x.Split(',')); } }, + { "r|resolvername=", "[optional, default=GeneratedResolver]Set resolver name", x => { ResolverName = x; } }, + { "n|namespace=", "[optional, default=MessagePack]Set namespace root name", x => { NamespaceRoot = x; } }, + { "m|usemapmode", "[optional, default=false]Force use map mode serialization", x => { IsUseMap = true; } }, + }; + if (args.Length == 0) + { + goto SHOW_HELP; + } + else + { + option.Parse(args); + + if (InputPath == null || OutputPath == null) + { + Console.WriteLine("Invalid Argument:" + string.Join(" ", args)); + Console.WriteLine(); + goto SHOW_HELP; + } + + IsParsed = true; + return; + } + + SHOW_HELP: + Console.WriteLine("mpc arguments help:"); + option.WriteOptionDescriptions(Console.Out); + IsParsed = false; + } + + public string GetNamespaceDot() + { + return string.IsNullOrWhiteSpace(NamespaceRoot) ? "" : NamespaceRoot + "."; + } + } + + + class Program + { + static void Main(string[] args) + { + var cmdArgs = new CommandlineArguments(args); + if (!cmdArgs.IsParsed) + { + return; + } + + // Generator Start... + + var sw = Stopwatch.StartNew(); + Console.WriteLine("Project Compilation Start:" + cmdArgs.InputPath); + + var collector = new TypeCollector(cmdArgs.InputPath, cmdArgs.ConditionalSymbols, true, cmdArgs.IsUseMap); + + Console.WriteLine("Project Compilation Complete:" + sw.Elapsed.ToString()); + Console.WriteLine(); + + sw.Restart(); + Console.WriteLine("Method Collect Start"); + + var (objectInfo, enumInfo, genericInfo, unionInfo) = collector.Collect(); + + Console.WriteLine("Method Collect Complete:" + sw.Elapsed.ToString()); + + Console.WriteLine("Output Generation Start"); + sw.Restart(); + + var objectFormatterTemplates = objectInfo + .GroupBy(x => x.Namespace) + .Select(x => new FormatterTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), + objectSerializationInfos = x.ToArray(), + }) + .ToArray(); + + var enumFormatterTemplates = enumInfo + .GroupBy(x => x.Namespace) + .Select(x => new EnumTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), + enumSerializationInfos = x.ToArray() + }) + .ToArray(); + + var unionFormatterTemplates = unionInfo + .GroupBy(x => x.Namespace) + .Select(x => new UnionTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), + unionSerializationInfos = x.ToArray() + }) + .ToArray(); + + var resolverTemplate = new ResolverTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Resolvers", + FormatterNamespace = cmdArgs.GetNamespaceDot() + "Formatters", + ResolverName = cmdArgs.ResolverName, + registerInfos = genericInfo.Cast().Concat(enumInfo).Concat(unionInfo).Concat(objectInfo).ToArray() + }; + + var sb = new StringBuilder(); + sb.AppendLine(resolverTemplate.TransformText()); + sb.AppendLine(); + foreach (var item in enumFormatterTemplates) + { + var text = item.TransformText(); + sb.AppendLine(text); + } + sb.AppendLine(); + foreach (var item in unionFormatterTemplates) + { + var text = item.TransformText(); + sb.AppendLine(text); + } + sb.AppendLine(); + foreach (var item in objectFormatterTemplates) + { + var text = item.TransformText(); + sb.AppendLine(text); + } + + Output(cmdArgs.OutputPath, sb.ToString()); + + Console.WriteLine("String Generation Complete:" + sw.Elapsed.ToString()); + } + + static void Output(string path, string text) + { + path = path.Replace("global::", ""); + + const string prefix = "[Out]"; + Console.WriteLine(prefix + path); + + var fi = new FileInfo(path); + if (!fi.Directory.Exists) + { + fi.Directory.Create(); + } + + System.IO.File.WriteAllText(path, text, Encoding.UTF8); + } + } +} diff --git a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs new file mode 100644 index 000000000..7dbc826f0 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs @@ -0,0 +1,214 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Buildalyzer; +using Buildalyzer.Workspaces; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using Buildalyzer.Environment; + +namespace MessagePack.CodeGenerator +{ + // Utility and Extension methods for Roslyn + internal static class RoslynExtensions + { + public static async Task GetCompilationFromProject(string csprojPath, params string[] preprocessorSymbols) + { + var analyzerOptions = new AnalyzerManagerOptions(); + // analyzerOptions.LogWriter = Console.Out; + + var manager = new AnalyzerManager(); + var projectAnalyzer = manager.GetProject(csprojPath); // addproj + // projectAnalyzer.AddBuildLogger(new Microsoft.Build.Logging.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Minimal)); + + var workspace = manager.GetWorkspaceWithPreventBuildEvent(); + + workspace.WorkspaceFailed += WorkSpaceFailed; + var project = workspace.CurrentSolution.Projects.First(); + project = project + .WithParseOptions((project.ParseOptions as CSharpParseOptions).WithPreprocessorSymbols(preprocessorSymbols)) + .WithCompilationOptions((project.CompilationOptions as CSharpCompilationOptions).WithAllowUnsafe(true)); + + var compilation = await project.GetCompilationAsync().ConfigureAwait(false); + return compilation; + } + + private static void WorkSpaceFailed(object sender, WorkspaceDiagnosticEventArgs e) + { + Console.WriteLine(e); + } + + public static AdhocWorkspace GetWorkspaceWithPreventBuildEvent(this AnalyzerManager manager) + { + // info article: https://qiita.com/skitoy4321/items/9edfb094549f5167a57f + var projPath = manager.Projects.First().Value.ProjectFile.Path; + var tempPath = Path.Combine(new FileInfo(projPath).Directory.FullName, "__buildtemp") + System.IO.Path.DirectorySeparatorChar; + + var envopts = new EnvironmentOptions(); + // "Clean" and "Build" is listed in default + // Modify to designtime system https://github.com/dotnet/project-system/blob/master/docs/design-time-builds.md#targets-that-run-during-design-time-builds + // that prevent Pre/PostBuildEvent + + envopts.TargetsToBuild.Clear(); + // Clean should not use(if use pre/post build, dll was deleted). + // envopts.TargetsToBuild.Add("Clean"); + envopts.TargetsToBuild.Add("ResolveAssemblyReferencesDesignTime"); + envopts.TargetsToBuild.Add("ResolveProjectReferencesDesignTime"); + envopts.TargetsToBuild.Add("ResolveComReferencesDesignTime"); + envopts.TargetsToBuild.Add("Compile"); + envopts.GlobalProperties["IntermediateOutputPath"] = tempPath; + try + { + return GetWorkspace(manager, envopts); + } + finally + { + if (Directory.Exists(tempPath)) + { + Directory.Delete(tempPath, true); + } + } + } + + public static AdhocWorkspace GetWorkspace(this AnalyzerManager manager, EnvironmentOptions envOptions) + { + // Run builds in parallel + List results = manager.Projects.Values + .AsParallel() + .Select(p => p.Build(envOptions).FirstOrDefault()) // with envoption + .Where(x => x != null) + .ToList(); + + // Add each result to a new workspace + AdhocWorkspace workspace = new AdhocWorkspace(); + foreach (AnalyzerResult result in results) + { + result.AddToWorkspace(workspace); + } + return workspace; + } + + public static IEnumerable GetNamedTypeSymbols(this Compilation compilation) + { + foreach (var syntaxTree in compilation.SyntaxTrees) + { + var semModel = compilation.GetSemanticModel(syntaxTree); + + foreach (var item in syntaxTree.GetRoot() + .DescendantNodes() + .Select(x => semModel.GetDeclaredSymbol(x)) + .Where(x => x != null)) + { + var namedType = item as INamedTypeSymbol; + if (namedType != null) + { + yield return namedType; + } + } + } + } + + public static IEnumerable EnumerateBaseType(this ITypeSymbol symbol) + { + var t = symbol.BaseType; + while (t != null) + { + yield return t; + t = t.BaseType; + } + } + + public static AttributeData FindAttribute(this IEnumerable attributeDataList, string typeName) + { + return attributeDataList + .Where(x => x.AttributeClass.ToDisplayString() == typeName) + .FirstOrDefault(); + } + + public static AttributeData FindAttributeShortName(this IEnumerable attributeDataList, + string typeName) + { + return attributeDataList + .Where(x => x.AttributeClass.Name == typeName) + .FirstOrDefault(); + } + + public static AttributeData FindAttributeIncludeBasePropertyShortName(this IPropertySymbol property, + string typeName) + { + do + { + var data = FindAttributeShortName(property.GetAttributes(), typeName); + if (data != null) return data; + property = property.OverriddenProperty; + } while (property != null); + + return null; + } + + public static AttributeSyntax FindAttribute(this BaseTypeDeclarationSyntax typeDeclaration, SemanticModel model, + string typeName) + { + return typeDeclaration.AttributeLists + .SelectMany(x => x.Attributes) + .Where(x => model.GetTypeInfo(x).Type?.ToDisplayString() == typeName) + .FirstOrDefault(); + } + + public static INamedTypeSymbol FindBaseTargetType(this ITypeSymbol symbol, string typeName) + { + return symbol.EnumerateBaseType() + .Where(x => x.OriginalDefinition?.ToDisplayString() == typeName) + .FirstOrDefault(); + } + + public static object GetSingleNamedArgumentValue(this AttributeData attribute, string key) + { + foreach (var item in attribute.NamedArguments) + { + if (item.Key == key) + { + return item.Value.Value; + } + } + + return null; + } + + public static bool IsNullable(this INamedTypeSymbol symbol) + { + if (symbol.IsGenericType) + { + if (symbol.ConstructUnboundGenericType().ToDisplayString() == "T?") + { + return true; + } + } + return false; + } + + public static IEnumerable GetAllMembers(this ITypeSymbol symbol) + { + var t = symbol; + while (t != null) + { + foreach (var item in t.GetMembers()) + { + yield return item; + } + t = t.BaseType; + } + } + + public static IEnumerable GetAllInterfaceMembers(this ITypeSymbol symbol) + { + return symbol.GetMembers() + .Concat(symbol.AllInterfaces.SelectMany(x => x.GetMembers())); + } + } +} \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/publish.bat b/src/MessagePack.UniversalCodeGenerator/publish.bat new file mode 100644 index 000000000..3b73841ed --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/publish.bat @@ -0,0 +1,3 @@ +dotnet publish MessagePack.UniversalCodeGenerator.csproj -c Release --self-contained -r win-x64 -o ./bin/MessagePackUniversalCodeGenerator/win-x64 +dotnet publish MessagePack.UniversalCodeGenerator.csproj -c Release --self-contained -r linux-x64 -o ./bin/MessagePackUniversalCodeGenerator/linux-x64 +dotnet publish MessagePack.UniversalCodeGenerator.csproj -c Release --self-contained -r osx-x64 -o ./bin/MessagePackUniversalCodeGenerator/osx-x64 \ No newline at end of file From a493c788228f88f6fa1438937cef99f0c3b4d1c8 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 12 Dec 2018 09:29:08 -0800 Subject: [PATCH 023/105] Branch off for v1.8 maintenance --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9f9cee002..fa4f580ce 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,6 +1,6 @@ trigger: branches: - include: ["master"] + include: ["master", "v1.8"] paths: exclude: ["doc", "*.md"] From 35123346c8afdd4cdcc30ece7decc5bf9b73eee7 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 12 Dec 2018 14:19:55 -0800 Subject: [PATCH 024/105] Don't strong-name sign assemblies that we don't pack --- src/Directory.Build.props | 7 ------- src/Directory.Build.targets | 8 ++++++++ 2 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 src/Directory.Build.props create mode 100644 src/Directory.Build.targets diff --git a/src/Directory.Build.props b/src/Directory.Build.props deleted file mode 100644 index 0b97445c1..000000000 --- a/src/Directory.Build.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - True - $(MSBuildThisFileDirectory)..\opensource.snk - - diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 000000000..570e63ce4 --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,8 @@ + + + + True + $(MSBuildThisFileDirectory)..\opensource.snk + + + From 78cb3417c0e285bab06e215ce925832808961c1f Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 12 Dec 2018 15:02:52 -0800 Subject: [PATCH 025/105] Workaround build break from AD0001 error Disables an irrelevant Roslyn analyzer that was throwing NRE --- .../MessagePack.UniversalCodeGenerator.csproj | 3 +- ...MessagePack.UniversalCodeGenerator.ruleset | 98 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.ruleset diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj index bdf2cf937..286628a8c 100644 --- a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj @@ -1,8 +1,9 @@ - + Exe netcoreapp2.1 + MessagePack.UniversalCodeGenerator.ruleset diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.ruleset b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.ruleset new file mode 100644 index 000000000..3e602bbaa --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.ruleset @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 88870516232b08d02f6660031a324dd187ed2584 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 13 Dec 2018 16:43:53 -0800 Subject: [PATCH 026/105] Consider nothing a public release Pending a decision on the hard fork and possibly changing package IDs. --- version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.json b/version.json index c1ecc3c44..9722d25e2 100644 --- a/version.json +++ b/version.json @@ -5,7 +5,7 @@ "precision": "revision" }, "publicReleaseRefSpec": [ - "^refs/heads/master$", // we release out of master - "^refs/heads/v\\d+(?:.\\d+)?$" // we also release out of vNN branches + //"^refs/heads/master$", // we release out of master + //"^refs/heads/v\\d+(?:.\\d+)?$" // we also release out of vNN branches ] } From db6d739650f5a69cf566cdec6fd64040f18ced5b Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 15 Dec 2018 21:38:18 -0800 Subject: [PATCH 027/105] Fix exception rethrowing to not stomp on callstack Also it was throwing out far too many inner exceptions that can be useful during failure investigations. --- src/MessagePack/IFormatterResolver.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/MessagePack/IFormatterResolver.cs b/src/MessagePack/IFormatterResolver.cs index 31aa440e7..81937d8ec 100644 --- a/src/MessagePack/IFormatterResolver.cs +++ b/src/MessagePack/IFormatterResolver.cs @@ -2,6 +2,7 @@ using MessagePack.Formatters; using System; using System.Reflection; +using System.Runtime.ExceptionServices; namespace MessagePack { @@ -21,13 +22,11 @@ public static IMessagePackFormatter GetFormatterWithVerify(this IFormatter } catch (TypeInitializationException ex) { - Exception inner = ex; - while (inner.InnerException != null) - { - inner = inner.InnerException; - } - - throw inner; + // The fact that we're using static constructors to initialize this is an internal detail. + // Rethrow the inner exception if there is one. + // Do it carefully so as to not stomp on the original callstack. + ExceptionDispatchInfo.Capture(ex.InnerException ?? ex).Throw(); + throw new InvalidOperationException("Unreachable"); // keep the compiler happy } if (formatter == null) From d1f893cfe2aacf591e724117d807199a4ad92531 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 15 Dec 2018 21:39:21 -0800 Subject: [PATCH 028/105] Fix ordering of Assert.Equal call arguments This will cause test failures to accurately report which value was expected vs. actual. --- tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs b/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs index 6c3a3a0bf..ebb161e0c 100644 --- a/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs +++ b/tests/MessagePack.Tests/Utils/ChainingAssertion.Xunit.cs @@ -144,8 +144,8 @@ public static void Is(this T actual, T expected) if (typeof(T) != typeof(string) && typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(typeof(T))) { Assert.Equal( - ((IEnumerable)actual).Cast().ToArray(), - ((IEnumerable)expected).Cast().ToArray()); + ((IEnumerable)expected).Cast().ToArray(), + ((IEnumerable)actual).Cast().ToArray()); return; } From 88ad0e64a2a313ce1460be3e41b7fa4f5173e051 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 15 Dec 2018 21:40:02 -0800 Subject: [PATCH 029/105] Support [DataContract] types that lack explicit [IgnoreMember] attributes Fixes neuecc#292 --- .../Resolvers/DynamicObjectResolver.cs | 8 +++- tests/MessagePack.Tests/DataContractTest.cs | 46 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index af8d3938e..4e0e3bd56 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -1426,7 +1426,9 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe var pseudokey = item.GetCustomAttribute(true); if (pseudokey == null) { - throw new MessagePackDynamicObjectResolverException("all public members must mark DataMemberAttribute or IgnoreMemberAttribute." + " type: " + type.FullName + " member:" + item.Name); + // This member has no DataMemberAttribute nor IgnoreMemberAttribute. + // But the type *did* have a DataContractAttribute on it, so no attribute implies the member should not be serialized. + continue; } // use Order first @@ -1507,7 +1509,9 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe var pseudokey = item.GetCustomAttribute(true); if (pseudokey == null) { - throw new MessagePackDynamicObjectResolverException("all public members must mark DataMemberAttribute or IgnoreMemberAttribute." + " type: " + type.FullName + " member:" + item.Name); + // This member has no DataMemberAttribute nor IgnoreMemberAttribute. + // But the type *did* have a DataContractAttribute on it, so no attribute implies the member should not be serialized. + continue; } // use Order first diff --git a/tests/MessagePack.Tests/DataContractTest.cs b/tests/MessagePack.Tests/DataContractTest.cs index b4d235f15..7c1969ec7 100644 --- a/tests/MessagePack.Tests/DataContractTest.cs +++ b/tests/MessagePack.Tests/DataContractTest.cs @@ -37,6 +37,26 @@ public class MyClass2 public string MyProperty2; } + [DataContract] + public class ClassWithPublicMembersWithoutAttributes + { + [DataMember] + public int AttributedProperty { get; set; } + + public int UnattributedProperty { get; set; } + + [IgnoreDataMember] + public int IgnoredProperty { get; set; } + + [DataMember] + public int AttributedField; + + public int UnattributedField; + + [IgnoreDataMember] + public int IgnoredField; + } + [Fact] public void SerializeOrder() { @@ -79,5 +99,31 @@ public void Serialize() MessagePackSerializer.ToJson(bin).Is(@"{""MyProperty1"":100,""MyProperty2"":""foobar""}"); } + + [Fact] + public void Serialize_WithVariousAttributes() + { + var mc = new ClassWithPublicMembersWithoutAttributes { + AttributedProperty = 1, + UnattributedProperty = 2, + IgnoredProperty = 3, + AttributedField = 4, + UnattributedField = 5, + IgnoredField = 6, + }; + + var bin = serializer.Serialize(mc); + var mc2 = serializer.Deserialize(bin); + + mc2.AttributedProperty.Is(mc.AttributedProperty); + mc2.AttributedField.Is(mc.AttributedField); + + mc2.UnattributedProperty.Is(0); + mc2.IgnoredProperty.Is(0); + mc2.UnattributedField.Is(0); + mc2.IgnoredField.Is(0); + + serializer.ToJson(bin).Is(@"{""AttributedProperty"":1,""AttributedField"":4}"); + } } } From 527dadf029e86ac34c0e86a6a3a4c37fd0e76ce9 Mon Sep 17 00:00:00 2001 From: neuecc Date: Mon, 17 Dec 2018 19:02:22 +0900 Subject: [PATCH 030/105] for Unity, NET STANDARD 2.0, UniversalCodeGenerator(moc) --- MessagePack.sln | 17 +- src/MessagePack.CodeGenerator/App.config | 46 - .../CodeAnalysis/Definitions.cs | 163 -- .../CodeAnalysis/TypeCollector.cs | 844 ---------- .../Generator/EnumTemplate.cs | 391 ----- .../Generator/EnumTemplate.tt | 37 - .../Generator/FormatterTemplate.cs | 818 --------- .../Generator/FormatterTemplate.tt | 158 -- .../Generator/ResolverTemplate.cs | 455 ----- .../Generator/ResolverTemplate.tt | 78 - .../Generator/TemplatePartials.cs | 33 - .../Generator/UnionTemplate.cs | 584 ------- .../Generator/UnionTemplate.tt | 115 -- .../MessagePack.CodeGenerator.csproj | 246 --- .../Mono.Options/Options.cs | 1463 ----------------- src/MessagePack.CodeGenerator/Nuget.config | 13 - src/MessagePack.CodeGenerator/Program.cs | 179 -- .../Properties/AssemblyInfo.cs | 36 - .../Utils/EnvironmentHelper.cs | 132 -- .../Utils/RoslynExtensions.cs | 190 --- src/MessagePack.CodeGenerator/packages.config | 67 - .../Assembly-CSharp.csproj | 426 +++++ .../Scripts/MessagePack/Shims/Reflection.cs | 5 +- .../MessagePack.UnityClient.sln | 12 +- .../ProjectSettings/PresetManager.asset | Bin 0 -> 4104 bytes .../ProjectSettings/ProjectSettings.asset | Bin 52147 -> 52972 bytes .../ProjectSettings/ProjectVersion.txt | 2 +- .../UnityConnectSettings.asset | Bin 4116 -> 4328 bytes ...nityAdsSettings.asset => VFXManager.asset} | Bin 4116 -> 4148 bytes .../UnityPackageManager/manifest.json | 4 - .../MessagePack.UniversalCodeGenerator.csproj | 2 + .../Internal/AutomataDictionary.cs | 14 +- src/MessagePack/Internal/DynamicAssembly.cs | 2 + .../Internal/ILGeneratorExtensions.cs | 2 + .../ContractlessReflectionObjectResolver.cs | 582 +++---- .../Resolvers/DynamicEnumResolver.cs | 2 + .../Resolvers/DynamicObjectResolver.cs | 48 +- .../Resolvers/DynamicUnionResolver.cs | 5 +- src/MessagePack/Resolvers/StandardResolver.cs | 10 +- 39 files changed, 784 insertions(+), 6397 deletions(-) delete mode 100644 src/MessagePack.CodeGenerator/App.config delete mode 100644 src/MessagePack.CodeGenerator/CodeAnalysis/Definitions.cs delete mode 100644 src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs delete mode 100644 src/MessagePack.CodeGenerator/Generator/EnumTemplate.cs delete mode 100644 src/MessagePack.CodeGenerator/Generator/EnumTemplate.tt delete mode 100644 src/MessagePack.CodeGenerator/Generator/FormatterTemplate.cs delete mode 100644 src/MessagePack.CodeGenerator/Generator/FormatterTemplate.tt delete mode 100644 src/MessagePack.CodeGenerator/Generator/ResolverTemplate.cs delete mode 100644 src/MessagePack.CodeGenerator/Generator/ResolverTemplate.tt delete mode 100644 src/MessagePack.CodeGenerator/Generator/TemplatePartials.cs delete mode 100644 src/MessagePack.CodeGenerator/Generator/UnionTemplate.cs delete mode 100644 src/MessagePack.CodeGenerator/Generator/UnionTemplate.tt delete mode 100644 src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj delete mode 100644 src/MessagePack.CodeGenerator/Mono.Options/Options.cs delete mode 100644 src/MessagePack.CodeGenerator/Nuget.config delete mode 100644 src/MessagePack.CodeGenerator/Program.cs delete mode 100644 src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs delete mode 100644 src/MessagePack.CodeGenerator/Utils/EnvironmentHelper.cs delete mode 100644 src/MessagePack.CodeGenerator/Utils/RoslynExtensions.cs delete mode 100644 src/MessagePack.CodeGenerator/packages.config create mode 100644 src/MessagePack.UnityClient/Assembly-CSharp.csproj create mode 100644 src/MessagePack.UnityClient/ProjectSettings/PresetManager.asset rename src/MessagePack.UnityClient/ProjectSettings/{UnityAdsSettings.asset => VFXManager.asset} (81%) delete mode 100644 src/MessagePack.UnityClient/UnityPackageManager/manifest.json diff --git a/MessagePack.sln b/MessagePack.sln index 0bd43dc0f..416f1d3d5 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -31,8 +31,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandbox", "sandbox", "{BF4C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.CodeGenerator", "src\MessagePack.CodeGenerator\MessagePack.CodeGenerator.csproj", "{D8B195AC-9E93-438E-8331-EF3A1F613D0B}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicCodeDumper", "sandbox\DynamicCodeDumper\DynamicCodeDumper.csproj", "{8E511130-F838-4B47-842B-0FB27AD175B5}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedData", "sandbox\SharedData\SharedData.csproj", "{3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}" @@ -55,7 +53,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerfBenchmarkDotNet", "sand EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestData2", "sandbox\TestData2\TestData2.csproj", "{2A32A538-BA26-4D89-85D0-E4249AFA0837}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UniversalCodeGenerator", "src\MessagePack.UniversalCodeGenerator\MessagePack.UniversalCodeGenerator.csproj", "{10AD85DD-929D-49B8-BD43-45242C2644B7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.UniversalCodeGenerator", "src\MessagePack.UniversalCodeGenerator\MessagePack.UniversalCodeGenerator.csproj", "{10AD85DD-929D-49B8-BD43-45242C2644B7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -103,18 +101,6 @@ Global {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x64.Build.0 = Release|Any CPU {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x86.ActiveCfg = Release|Any CPU {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x86.Build.0 = Release|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Debug|x64.ActiveCfg = Debug|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Debug|x64.Build.0 = Debug|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Debug|x86.ActiveCfg = Debug|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Debug|x86.Build.0 = Debug|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Release|Any CPU.Build.0 = Release|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Release|x64.ActiveCfg = Release|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Release|x64.Build.0 = Release|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Release|x86.ActiveCfg = Release|Any CPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B}.Release|x86.Build.0 = Release|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -267,7 +253,6 @@ Global {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} {9E1A55CA-711D-4F58-A332-735960E3434C} = {19FE674A-AC94-4E7E-B24C-2285D1D04CDE} {ED43BDA5-947C-4769-A47A-F07D3C6142AE} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} - {D8B195AC-9E93-438E-8331-EF3A1F613D0B} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} {8E511130-F838-4B47-842B-0FB27AD175B5} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} diff --git a/src/MessagePack.CodeGenerator/App.config b/src/MessagePack.CodeGenerator/App.config deleted file mode 100644 index f276422ac..000000000 --- a/src/MessagePack.CodeGenerator/App.config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/CodeAnalysis/Definitions.cs b/src/MessagePack.CodeGenerator/CodeAnalysis/Definitions.cs deleted file mode 100644 index e754d5767..000000000 --- a/src/MessagePack.CodeGenerator/CodeAnalysis/Definitions.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MessagePack.CodeGenerator -{ - public interface IResolverRegisterInfo - { - string FullName { get; } - string FormatterName { get; } - } - - public class ObjectSerializationInfo : IResolverRegisterInfo - { - public string Name { get; set; } - public string FullName { get; set; } - public string Namespace { get; set; } - public bool IsIntKey { get; set; } - public bool IsStringKey { get { return !IsIntKey; } } - public bool IsClass { get; set; } - public bool IsStruct { get { return !IsClass; } } - public MemberSerializationInfo[] ConstructorParameters { get; set; } - public MemberSerializationInfo[] Members { get; set; } - public bool HasIMessagePackSerializationCallbackReceiver { get; set; } - public bool NeedsCastOnBefore { get; set; } - public bool NeedsCastOnAfter { get; set; } - public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter"; - - public int WriteCount - { - get - { - if (IsStringKey) - { - return Members.Count(x => x.IsReadable); - } - else - { - return MaxKey; - } - } - } - - public int MaxKey - { - get - { - return Members.Where(x => x.IsReadable).Select(x => x.IntKey).DefaultIfEmpty(-1).Max(); - } - } - - public MemberSerializationInfo GetMember(int index) - { - return Members.FirstOrDefault(x => x.IntKey == index); - } - - public string GetConstructorString() - { - var args = string.Join(", ", ConstructorParameters.Select(x => "__" + x.Name + "__")); - return $"{FullName}({args})"; - } - } - - public class MemberSerializationInfo - { - public bool IsProperty { get; set; } - public bool IsField { get; set; } - public bool IsWritable { get; set; } - public bool IsReadable { get; set; } - public int IntKey { get; set; } - public string StringKey { get; set; } - public string Type { get; set; } - public string Name { get; set; } - public string ShortTypeName { get; set; } - - readonly HashSet primitiveTypes = new HashSet(new string[] - { - "short", - "int", - "long", - "ushort", - "uint", - "ulong", - "float", - "double", - "bool", - "byte", - "sbyte", - "char", - //"global::System.DateTime", - //"byte[]", - //"string", - }); - - public string GetSerializeMethodString() - { - if (primitiveTypes.Contains(Type)) - { - return $"MessagePackBinary.Write{ShortTypeName.Replace("[]", "s")}(ref bytes, offset, value.{Name})"; - } - else - { - return $"formatterResolver.GetFormatterWithVerify<{Type}>().Serialize(ref bytes, offset, value.{Name}, formatterResolver)"; - } - } - - public string GetDeserializeMethodString() - { - if (primitiveTypes.Contains(Type)) - { - return $"MessagePackBinary.Read{ShortTypeName.Replace("[]", "s")}(bytes, offset, out readSize)"; - } - else - { - return $"formatterResolver.GetFormatterWithVerify<{Type}>().Deserialize(bytes, offset, formatterResolver, out readSize)"; - } - } - } - - public class EnumSerializationInfo : IResolverRegisterInfo - { - public string Namespace { get; set; } - public string Name { get; set; } - public string FullName { get; set; } - public string UnderlyingType { get; set; } - - public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter"; - } - - public class GenericSerializationInfo : IResolverRegisterInfo, IEquatable - { - public string FullName { get; set; } - - public string FormatterName { get; set; } - - public bool Equals(GenericSerializationInfo other) - { - return FullName.Equals(other.FullName); - } - - public override int GetHashCode() - { - return FullName.GetHashCode(); - } - } - - public class UnionSerializationInfo : IResolverRegisterInfo - { - public string Namespace { get; set; } - public string Name { get; set; } - public string FullName { get; set; } - public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter"; - public UnionSubTypeInfo[] SubTypes { get; set; } - } - - public class UnionSubTypeInfo - { - public string Type { get; set; } - public int Key { get; set; } - } -} \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs deleted file mode 100644 index e51ebf70d..000000000 --- a/src/MessagePack.CodeGenerator/CodeAnalysis/TypeCollector.cs +++ /dev/null @@ -1,844 +0,0 @@ -using Microsoft.CodeAnalysis; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace MessagePack.CodeGenerator -{ - public class ReferenceSymbols - { - public readonly INamedTypeSymbol Task; - public readonly INamedTypeSymbol TaskOfT; - public readonly INamedTypeSymbol MessagePackObjectAttribute; - public readonly INamedTypeSymbol UnionAttribute; - public readonly INamedTypeSymbol SerializationConstructorAttribute; - public readonly INamedTypeSymbol KeyAttribute; - public readonly INamedTypeSymbol IgnoreAttribute; - public readonly INamedTypeSymbol IgnoreDataMemberAttribute; - public readonly INamedTypeSymbol IMessagePackSerializationCallbackReceiver; - - public ReferenceSymbols(Compilation compilation) - { - TaskOfT = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1"); - Task = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task"); - MessagePackObjectAttribute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); - UnionAttribute = compilation.GetTypeByMetadataName("MessagePack.UnionAttribute"); - SerializationConstructorAttribute = compilation.GetTypeByMetadataName("MessagePack.SerializationConstructorAttribute"); - KeyAttribute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); - IgnoreAttribute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute"); - IgnoreDataMemberAttribute = compilation.GetTypeByMetadataName("System.Runtime.Serialization.IgnoreDataMemberAttribute"); - IMessagePackSerializationCallbackReceiver = compilation.GetTypeByMetadataName("MessagePack.IMessagePackSerializationCallbackReceiver"); - } - } - - public class TypeCollector - { - const string CodegeneratorOnlyPreprocessorSymbol = "INCLUDE_ONLY_CODE_GENERATION"; - - static readonly SymbolDisplayFormat binaryWriteFormat = new SymbolDisplayFormat( - genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, - miscellaneousOptions: SymbolDisplayMiscellaneousOptions.ExpandNullable, - typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameOnly); - - static readonly SymbolDisplayFormat shortTypeNameFormat = new SymbolDisplayFormat( - typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypes); - - readonly string csProjPath; - readonly bool isForceUseMap; - readonly ReferenceSymbols typeReferences; - readonly INamedTypeSymbol[] targetTypes; - readonly HashSet embeddedTypes = new HashSet(new string[] - { - "short", - "int", - "long", - "ushort", - "uint", - "ulong", - "float", - "double", - "bool", - "byte", - "sbyte", - "decimal", - "char", - "string", - "object", - "System.Guid", - "System.TimeSpan", - "System.DateTime", - "System.DateTimeOffset", - - "MessagePack.Nil", - - // and arrays - - "short[]", - "int[]", - "long[]", - "ushort[]", - "uint[]", - "ulong[]", - "float[]", - "double[]", - "bool[]", - "byte[]", - "sbyte[]", - "decimal[]", - "char[]", - "string[]", - "System.DateTime[]", - "System.ArraySegment", - "System.ArraySegment?", - - // extensions - - "UnityEngine.Vector2", - "UnityEngine.Vector3", - "UnityEngine.Vector4", - "UnityEngine.Quaternion", - "UnityEngine.Color", - "UnityEngine.Bounds", - "UnityEngine.Rect", - "UnityEngine.AnimationCurve", - "UnityEngine.RectOffset", - "UnityEngine.Gradient", - "UnityEngine.WrapMode", - "UnityEngine.GradientMode", - "UnityEngine.Keyframe", - "UnityEngine.Matrix4x4", - "UnityEngine.GradientColorKey", - "UnityEngine.GradientAlphaKey", - "UnityEngine.Color32", - "UnityEngine.LayerMask", - "UnityEngine.Vector2Int", - "UnityEngine.Vector3Int", - "UnityEngine.RangeInt", - "UnityEngine.RectInt", - "UnityEngine.BoundsInt", - - "System.Reactive.Unit", - }); - - readonly Dictionary knownGenericTypes = new Dictionary - { - {"System.Collections.Generic.List<>", "global::MessagePack.Formatters.ListFormatter" }, - {"System.Collections.Generic.LinkedList<>", "global::MessagePack.Formatters.LinkedListFormatter"}, - {"System.Collections.Generic.Queue<>", "global::MessagePack.Formatters.QeueueFormatter"}, - {"System.Collections.Generic.Stack<>", "global::MessagePack.Formatters.StackFormatter"}, - {"System.Collections.Generic.HashSet<>", "global::MessagePack.Formatters.HashSetFormatter"}, - {"System.Collections.ObjectModel.ReadOnlyCollection<>", "global::MessagePack.Formatters.ReadOnlyCollectionFormatter"}, - {"System.Collections.Generic.IList<>", "global::MessagePack.Formatters.InterfaceListFormatter"}, - {"System.Collections.Generic.ICollection<>", "global::MessagePack.Formatters.InterfaceCollectionFormatter"}, - {"System.Collections.Generic.IEnumerable<>", "global::MessagePack.Formatters.InterfaceEnumerableFormatter"}, - {"System.Collections.Generic.Dictionary<,>", "global::MessagePack.Formatters.DictionaryFormatter"}, - {"System.Collections.Generic.IDictionary<,>", "global::MessagePack.Formatters.InterfaceDictionaryFormatter"}, - {"System.Collections.Generic.SortedDictionary<,>", "global::MessagePack.Formatters.SortedDictionaryFormatter"}, - {"System.Collections.Generic.SortedList<,>", "global::MessagePack.Formatters.SortedListFormatter"}, - {"System.Linq.ILookup<,>", "global::MessagePack.Formatters.InterfaceLookupFormatter"}, - {"System.Linq.IGrouping<,>", "global::MessagePack.Formatters.InterfaceGroupingFormatter"}, - {"System.Collections.ObjectModel.ObservableCollection<>", "global::MessagePack.Formatters.ObservableCollectionFormatter"}, - {"System.Collections.ObjectModel.ReadOnlyObservableCollection<>", "global::MessagePack.Formatters.ReadOnlyObservableCollectionFormatter" }, - {"System.Collections.Generic.IReadOnlyList<>", "global::MessagePack.Formatters.InterfaceReadOnlyListFormatter"}, - {"System.Collections.Generic.IReadOnlyCollection<>", "global::MessagePack.Formatters.InterfaceReadOnlyCollectionFormatter"}, - {"System.Collections.Generic.ISet<>", "global::MessagePack.Formatters.InterfaceSetFormatter"}, - {"System.Collections.Concurrent.ConcurrentBag<>", "global::MessagePack.Formatters.ConcurrentBagFormatter"}, - {"System.Collections.Concurrent.ConcurrentQueue<>", "global::MessagePack.Formatters.ConcurrentQueueFormatter"}, - {"System.Collections.Concurrent.ConcurrentStack<>", "global::MessagePack.Formatters.ConcurrentStackFormatter"}, - {"System.Collections.ObjectModel.ReadOnlyDictionary<,>", "global::MessagePack.Formatters.ReadOnlyDictionaryFormatter"}, - {"System.Collections.Generic.IReadOnlyDictionary<,>", "global::MessagePack.Formatters.InterfaceReadOnlyDictionaryFormatter"}, - {"System.Collections.Concurrent.ConcurrentDictionary<,>", "global::MessagePack.Formatters.ConcurrentDictionaryFormatter"}, - {"System.Lazy<>", "global::MessagePack.Formatters.LazyFormatter"}, - {"System.Threading.Tasks<>", "global::MessagePack.Formatters.TaskValueFormatter"}, - - {"System.Tuple<>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,,>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,,,>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,,,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, - {"System.Tuple<,,,,,,,>", "global::MessagePack.Formatters.TupleFormatter"}, - - {"System.ValueTuple<>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - {"System.ValueTuple<,,,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter"}, - - {"System.Collections.Generic.KeyValuePair<,>", "global::MessagePack.Formatters.KeyValuePairFormatter"}, - {"System.Threading.Tasks.ValueTask<>", "global::MessagePack.Formatters.KeyValuePairFormatter"}, - {"System.ArraySegment<>", "global::MessagePack.Formatters.ArraySegmentFormatter"}, - - // extensions - - {"System.Collections.Immutable.ImmutableArray<>", "global::MessagePack.ImmutableCollection.ImmutableArrayFormatter"}, - {"System.Collections.Immutable.ImmutableList<>", "global::MessagePack.ImmutableCollection.ImmutableListFormatter"}, - {"System.Collections.Immutable.ImmutableDictionary<,>", "global::MessagePack.ImmutableCollection.ImmutableDictionaryFormatter"}, - {"System.Collections.Immutable.ImmutableHashSet<>", "global::MessagePack.ImmutableCollection.ImmutableHashSetFormatter"}, - {"System.Collections.Immutable.ImmutableSortedDictionary<,>", "global::MessagePack.ImmutableCollection.ImmutableSortedDictionaryFormatter"}, - {"System.Collections.Immutable.ImmutableSortedSet<>", "global::MessagePack.ImmutableCollection.ImmutableSortedSetFormatter"}, - {"System.Collections.Immutable.ImmutableQueue<>", "global::MessagePack.ImmutableCollection.ImmutableQueueFormatter"}, - {"System.Collections.Immutable.ImmutableStack<>", "global::MessagePack.ImmutableCollection.ImmutableStackFormatter"}, - {"System.Collections.Immutable.IImmutableList<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableListFormatter"}, - {"System.Collections.Immutable.IImmutableDictionary<,>", "global::MessagePack.ImmutableCollection.InterfaceImmutableDictionaryFormatter"}, - {"System.Collections.Immutable.IImmutableQueue<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableQueueFormatter"}, - {"System.Collections.Immutable.IImmutableSet<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableSetFormatter"}, - {"System.Collections.Immutable.IImmutableStack<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableStackFormatter"}, - - {"Reactive.Bindings.ReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.ReactivePropertyFormatter"}, - {"Reactive.Bindings.IReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.InterfaceReactivePropertyFormatter"}, - {"Reactive.Bindings.IReadOnlyReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.InterfaceReadOnlyReactivePropertyFormatter"}, - {"Reactive.Bindings.ReactiveCollection<>", "global::MessagePack.ReactivePropertyExtension.ReactiveCollectionFormatter"}, - }; - - readonly bool disallowInternal; - - // visitor workspace: - HashSet alreadyCollected; - List collectedObjectInfo; - List collectedEnumInfo; - List collectedGenericInfo; - List collectedUnionInfo; - - // --- - - public TypeCollector(string csProjPath, IEnumerable conditinalSymbols, bool disallowInternal, bool isForceUseMap) - { - this.csProjPath = csProjPath; - var compilation = RoslynExtensions.GetCompilationFromProject(csProjPath, conditinalSymbols.Concat(new[] { CodegeneratorOnlyPreprocessorSymbol }).ToArray()).GetAwaiter().GetResult(); - this.typeReferences = new ReferenceSymbols(compilation); - this.disallowInternal = disallowInternal; - this.isForceUseMap = isForceUseMap; - - targetTypes = compilation.GetNamedTypeSymbols() - .Where(x => - { - if (x.DeclaredAccessibility == Accessibility.Public) return true; - if (!disallowInternal) - { - return (x.DeclaredAccessibility == Accessibility.Friend); - } - - return false; - }) - .Where(x => - ((x.TypeKind == TypeKind.Interface) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) - || ((x.TypeKind == TypeKind.Class && x.IsAbstract) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute)) - || ((x.TypeKind == TypeKind.Class) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) - || ((x.TypeKind == TypeKind.Struct) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute)) - ) - .ToArray(); - } - - void ResetWorkspace() - { - alreadyCollected = new HashSet(); - collectedObjectInfo = new List(); - collectedEnumInfo = new List(); - collectedGenericInfo = new List(); - collectedUnionInfo = new List(); - } - - // EntryPoint - public (ObjectSerializationInfo[] objectInfo, EnumSerializationInfo[] enumInfo, GenericSerializationInfo[] genericInfo, UnionSerializationInfo[] unionInfo) Collect() - { - ResetWorkspace(); - - foreach (var item in targetTypes) - { - CollectCore(item); - } - - return (collectedObjectInfo.ToArray(), collectedEnumInfo.ToArray(), collectedGenericInfo.Distinct().ToArray(), collectedUnionInfo.ToArray()); - } - - // Gate of recursive collect - void CollectCore(ITypeSymbol typeSymbol) - { - if (!alreadyCollected.Add(typeSymbol)) - { - return; - } - - if (embeddedTypes.Contains(typeSymbol.ToString())) - { - return; - } - - if (typeSymbol.TypeKind == TypeKind.Array) - { - CollectArray(typeSymbol as IArrayTypeSymbol); - return; - } - - if (!IsAllowAccessibility(typeSymbol)) - { - return; - } - - var type = typeSymbol as INamedTypeSymbol; - - if (typeSymbol.TypeKind == TypeKind.Enum) - { - CollectEnum(type); - return; - } - - if (type.IsGenericType) - { - CollectGeneric(type); - return; - } - - if (type.Locations[0].IsInMetadata) - { - return; - } - - if (type.TypeKind == TypeKind.Interface || (type.TypeKind == TypeKind.Class && type.IsAbstract)) - { - CollectUnion(type); - return; - } - - CollectObject(type); - return; - } - - void CollectEnum(INamedTypeSymbol type) - { - var info = new EnumSerializationInfo - { - Name = type.Name, - Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), - FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - UnderlyingType = type.EnumUnderlyingType.ToDisplayString(binaryWriteFormat) - }; - - collectedEnumInfo.Add(info); - } - - void CollectUnion(INamedTypeSymbol type) - { - var unionAttrs = type.GetAttributes().Where(x => x.AttributeClass == typeReferences.UnionAttribute).Select(x => x.ConstructorArguments).ToArray(); - if (unionAttrs.Length == 0) - { - throw new MessagePackGeneratorResolveFailedException("Serialization Type must mark UnionAttribute." + " type: " + type.Name); - } - - // 0, Int 1, SubType - var info = new UnionSerializationInfo - { - Name = type.Name, - Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), - FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - SubTypes = unionAttrs.Select(x => new UnionSubTypeInfo - { - Key = (int)x[0].Value, - Type = (x[1].Value as ITypeSymbol).ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - }).OrderBy(x => x.Key).ToArray() - }; - - collectedUnionInfo.Add(info); - } - - void CollectArray(IArrayTypeSymbol array) - { - var elemType = array.ElementType; - CollectCore(elemType); - - var info = new GenericSerializationInfo - { - FullName = array.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - }; - - if (array.IsSZArray) - { - info.FormatterName = $"global::MessagePack.Formatters.ArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; - } - else if (array.Rank == 2) - { - info.FormatterName = $"global::MessagePack.Formatters.TwoDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; - } - else if (array.Rank == 3) - { - info.FormatterName = $"global::MessagePack.Formatters.ThreeDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; - } - else if (array.Rank == 4) - { - info.FormatterName = $"global::MessagePack.Formatters.FourDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; - } - else - { - throw new InvalidOperationException("does not supports array dimention, " + info.FullName); - } - - collectedGenericInfo.Add(info); - - return; - } - - void CollectGeneric(INamedTypeSymbol type) - { - var genericType = type.ConstructUnboundGenericType(); - var genericTypeString = genericType.ToDisplayString(); - var fullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); - - // special case - if (fullName == "global::System.ArraySegment" || fullName == "global::System.ArraySegment?") - { - return; - } - - // nullable - if (genericTypeString == "T?") - { - CollectCore(type.TypeArguments[0]); - - if (!embeddedTypes.Contains(type.TypeArguments[0].ToString())) - { - var info = new GenericSerializationInfo - { - FormatterName = $"global::MessagePack.Formatters.NullableFormatter<{type.TypeArguments[0].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>", - FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - }; - - collectedGenericInfo.Add(info); - } - return; - } - - // collection - if (knownGenericTypes.TryGetValue(genericTypeString, out var formatter)) - { - foreach (var item in type.TypeArguments) - { - CollectCore(item); - } - - var typeArgs = string.Join(", ", type.TypeArguments.Select(x => x.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))); - var f = formatter.Replace("TREPLACE", typeArgs); - - var info = new GenericSerializationInfo - { - FormatterName = f, - FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - }; - - collectedGenericInfo.Add(info); - - if (genericTypeString == "System.Linq.ILookup<,>") - { - formatter = knownGenericTypes["System.Linq.IGrouping<,>"]; - f = formatter.Replace("TREPLACE", typeArgs); - - var groupingInfo = new GenericSerializationInfo - { - FormatterName = f, - FullName = $"global::System.Linq.IGrouping<{typeArgs}>", - }; - - collectedGenericInfo.Add(groupingInfo); - - formatter = knownGenericTypes["System.Collections.Generic.IEnumerable<>"]; - typeArgs = type.TypeArguments[1].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); - f = formatter.Replace("TREPLACE", typeArgs); - - var enumerableInfo = new GenericSerializationInfo - { - FormatterName = f, - FullName = $"global::System.Collections.Generic.IEnumerable<{typeArgs}>", - }; - - collectedGenericInfo.Add(enumerableInfo); - } - } - } - - void CollectObject(INamedTypeSymbol type) - { - var isClass = !type.IsValueType; - - var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribute); - if (contractAttr == null) - { - throw new MessagePackGeneratorResolveFailedException("Serialization Object must mark MessagePackObjectAttribute." + " type: " + type.Name); - } - - var isIntKey = true; - var intMemebrs = new Dictionary(); - var stringMembers = new Dictionary(); - - if (isForceUseMap || (bool)contractAttr.ConstructorArguments[0].Value) - { - // All public members are serialize target except [Ignore] member. - isIntKey = false; - - var hiddenIntKey = 0; - - foreach (var item in type.GetAllMembers().OfType().Where(x => !x.IsOverride)) - { - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; - - var member = new MemberSerializationInfo - { - IsReadable = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, - IsWritable = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, - StringKey = item.Name, - IsProperty = true, - IsField = false, - Name = item.Name, - Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) - }; - if (!member.IsReadable && !member.IsWritable) continue; - member.IntKey = hiddenIntKey++; - stringMembers.Add(member.StringKey, member); - - CollectCore(item.Type); // recursive collect - } - foreach (var item in type.GetAllMembers().OfType()) - { - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; - if (item.IsImplicitlyDeclared) continue; - - var member = new MemberSerializationInfo - { - IsReadable = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, - IsWritable = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic, - StringKey = item.Name, - IsProperty = false, - IsField = true, - Name = item.Name, - Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) - }; - if (!member.IsReadable && !member.IsWritable) continue; - member.IntKey = hiddenIntKey++; - stringMembers.Add(member.StringKey, member); - CollectCore(item.Type); // recursive collect - } - } - else - { - // Only KeyAttribute members - var searchFirst = true; - var hiddenIntKey = 0; - - foreach (var item in type.GetAllMembers().OfType()) - { - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; - - var member = new MemberSerializationInfo - { - IsReadable = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, - IsWritable = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, - IsProperty = true, - IsField = false, - Name = item.Name, - Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) - }; - if (!member.IsReadable && !member.IsWritable) continue; - - var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; - if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); - - var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; - var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null; - if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name); - - if (searchFirst) - { - searchFirst = false; - isIntKey = intKey != null; - } - else - { - if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null)) - { - throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name); - } - } - - if (isIntKey) - { - member.IntKey = (int)intKey; - if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); - - intMemebrs.Add(member.IntKey, member); - } - else - { - member.StringKey = (string)stringKey; - if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); - - member.IntKey = hiddenIntKey++; - stringMembers.Add(member.StringKey, member); - } - - CollectCore(item.Type); // recursive collect - } - - foreach (var item in type.GetAllMembers().OfType()) - { - if (item.IsImplicitlyDeclared) continue; - if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute)) continue; - - var member = new MemberSerializationInfo - { - IsReadable = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic, - IsWritable = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic, - IsProperty = true, - IsField = false, - Name = item.Name, - Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat) - }; - if (!member.IsReadable && !member.IsWritable) continue; - - var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; - if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); - - var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; - var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null; - if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name); - - if (searchFirst) - { - searchFirst = false; - isIntKey = intKey != null; - } - else - { - if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null)) - { - throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name); - } - } - - if (isIntKey) - { - member.IntKey = (int)intKey; - if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); - - intMemebrs.Add(member.IntKey, member); - } - else - { - member.StringKey = (string)stringKey; - if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); - - member.IntKey = hiddenIntKey++; - stringMembers.Add(member.StringKey, member); - } - - CollectCore(item.Type); // recursive collect - } - } - - // GetConstructor - IEnumerator ctorEnumerator = null; - var ctor = type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public).SingleOrDefault(x => x.GetAttributes().Any(y => y.AttributeClass == typeReferences.SerializationConstructorAttribute)); - if (ctor == null) - { - ctorEnumerator = - type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public && !x.IsImplicitlyDeclared).OrderBy(x => x.Parameters.Length) - .Concat(type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public).OrderBy(x => x.Parameters.Length).Take(1)) - .GetEnumerator(); - - if (ctorEnumerator.MoveNext()) - { - ctor = ctorEnumerator.Current; - } - } - - // struct allows null ctor - if (ctor == null && isClass) throw new MessagePackGeneratorResolveFailedException("can't find public constructor. type:" + type.Name); - - var constructorParameters = new List(); - if (ctor != null) - { - var constructorLookupDictionary = stringMembers.ToLookup(x => x.Key, x => x, StringComparer.OrdinalIgnoreCase); - do - { - constructorParameters.Clear(); - var ctorParamIndex = 0; - foreach (var item in ctor.Parameters) - { - MemberSerializationInfo paramMember; - if (isIntKey) - { - if (intMemebrs.TryGetValue(ctorParamIndex, out paramMember)) - { - if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable) - { - constructorParameters.Add(paramMember); - } - else - { - if (ctorEnumerator != null) - { - ctor = null; - continue; - } - else - { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterIndex:" + ctorParamIndex + " paramterType:" + item.Type.Name); - } - } - } - else - { - if (ctorEnumerator != null) - { - ctor = null; - continue; - } - else - { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterIndex:" + ctorParamIndex); - } - } - } - else - { - var hasKey = constructorLookupDictionary[item.Name]; - var len = hasKey.Count(); - if (len != 0) - { - if (len != 1) - { - if (ctorEnumerator != null) - { - ctor = null; - continue; - } - else - { - throw new MessagePackGeneratorResolveFailedException("duplicate matched constructor parameter name:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); - } - } - - paramMember = hasKey.First().Value; - if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable) - { - constructorParameters.Add(paramMember); - } - else - { - if (ctorEnumerator != null) - { - ctor = null; - continue; - } - else - { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); - } - } - } - else - { - if (ctorEnumerator != null) - { - ctor = null; - continue; - } - else - { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterName:" + item.Name); - } - } - } - ctorParamIndex++; - } - } while (TryGetNextConstructor(ctorEnumerator, ref ctor)); - - if (ctor == null) - { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor. type:" + type.Name); - } - } - - var hasSerializationConstructor = type.AllInterfaces.Any(x => x == typeReferences.IMessagePackSerializationCallbackReceiver); - var needsCastOnBefore = true; - var needsCastOnAfter = true; - if (hasSerializationConstructor) - { - needsCastOnBefore = !type.GetMembers("OnBeforeSerialize").Any(); - needsCastOnAfter = !type.GetMembers("OnAfterDeserialize").Any(); - } - - var info = new ObjectSerializationInfo - { - IsClass = isClass, - ConstructorParameters = constructorParameters.ToArray(), - IsIntKey = isIntKey, - Members = (isIntKey) ? intMemebrs.Values.ToArray() : stringMembers.Values.ToArray(), - Name = type.ToDisplayString(shortTypeNameFormat).Replace(".", "_"), - FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), - HasIMessagePackSerializationCallbackReceiver = hasSerializationConstructor, - NeedsCastOnAfter = needsCastOnAfter, - NeedsCastOnBefore = needsCastOnBefore - }; - collectedObjectInfo.Add(info); - } - - static bool TryGetNextConstructor(IEnumerator ctorEnumerator, ref IMethodSymbol ctor) - { - if (ctorEnumerator == null || ctor != null) - { - return false; - } - - if (ctorEnumerator.MoveNext()) - { - ctor = ctorEnumerator.Current; - return true; - } - else - { - ctor = null; - return false; - } - } - - bool IsAllowAccessibility(ITypeSymbol symbol) - { - do - { - if (symbol.DeclaredAccessibility != Accessibility.Public) - { - if (disallowInternal) - { - return false; - } - - if (symbol.DeclaredAccessibility != Accessibility.Internal) - { - return true; - } - } - - symbol = symbol.ContainingType; - } while (symbol != null); - - return true; - } - } - - public class MessagePackGeneratorResolveFailedException : Exception - { - public MessagePackGeneratorResolveFailedException(string message) - : base(message) - { - - } - } -} \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/Generator/EnumTemplate.cs b/src/MessagePack.CodeGenerator/Generator/EnumTemplate.cs deleted file mode 100644 index ba322bdb4..000000000 --- a/src/MessagePack.CodeGenerator/Generator/EnumTemplate.cs +++ /dev/null @@ -1,391 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 -// -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 -// -// ------------------------------------------------------------------------------ -namespace MessagePack.CodeGenerator.Generator -{ - using System.Linq; - using System.Text; - using System.Collections.Generic; - using System; - - /// - /// Class to produce the template output - /// - - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public partial class EnumTemplate : EnumTemplateBase - { -#line hidden - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + - " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); - - #line default - #line hidden - this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n"); - - #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - foreach(var info in enumSerializationInfos) { - - #line default - #line hidden - this.Write(" public sealed class "); - - #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); - - #line default - #line hidden - this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); - - #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(">\r\n {\r\n public int Serialize(ref byte[] bytes, int offset, "); - - #line 19 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n " + - " return MessagePackBinary.Write"); - - #line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); - - #line default - #line hidden - this.Write("(ref bytes, offset, ("); - - #line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); - - #line default - #line hidden - this.Write(")value);\r\n }\r\n \r\n public "); - - #line 24 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" + - "matterResolver, out int readSize)\r\n {\r\n return ("); - - #line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(")MessagePackBinary.Read"); - - #line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); - - #line default - #line hidden - this.Write("(bytes, offset, out readSize);\r\n }\r\n }\r\n\r\n"); - - #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - } - - #line default - #line hidden - this.Write("\r\n}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning " + - "restore 618\r\n#pragma warning restore 612"); - return this.GenerationEnvironment.ToString(); - } - } - - #line default - #line hidden - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public class EnumTemplateBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - protected System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/src/MessagePack.CodeGenerator/Generator/EnumTemplate.tt b/src/MessagePack.CodeGenerator/Generator/EnumTemplate.tt deleted file mode 100644 index 846ee8d0c..000000000 --- a/src/MessagePack.CodeGenerator/Generator/EnumTemplate.tt +++ /dev/null @@ -1,37 +0,0 @@ -<#@ template debug="false" hostspecific="false" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -#pragma warning disable 618 -#pragma warning disable 612 -#pragma warning disable 414 -#pragma warning disable 168 - -namespace <#= Namespace #> -{ - using System; - using MessagePack; - -<# foreach(var info in enumSerializationInfos) { #> - public sealed class <#= info.Name #>Formatter : global::MessagePack.Formatters.IMessagePackFormatter<<#= info.FullName #>> - { - public int Serialize(ref byte[] bytes, int offset, <#= info.FullName #> value, global::MessagePack.IFormatterResolver formatterResolver) - { - return MessagePackBinary.Write<#= info.UnderlyingType #>(ref bytes, offset, (<#= info.UnderlyingType #>)value); - } - - public <#= info.FullName #> Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) - { - return (<#= info.FullName #>)MessagePackBinary.Read<#= info.UnderlyingType #>(bytes, offset, out readSize); - } - } - -<# } #> - -} - -#pragma warning restore 168 -#pragma warning restore 414 -#pragma warning restore 618 -#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/Generator/FormatterTemplate.cs b/src/MessagePack.CodeGenerator/Generator/FormatterTemplate.cs deleted file mode 100644 index 1d9f52c69..000000000 --- a/src/MessagePack.CodeGenerator/Generator/FormatterTemplate.cs +++ /dev/null @@ -1,818 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 -// -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 -// -// ------------------------------------------------------------------------------ -namespace MessagePack.CodeGenerator.Generator -{ - using System.Linq; - using System.Text; - using System.Collections.Generic; - using System; - - /// - /// Class to produce the template output - /// - - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public partial class FormatterTemplate : FormatterTemplateBase - { -#line hidden - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + - " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); - - #line default - #line hidden - this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n"); - - #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - foreach(var objInfo in objectSerializationInfos) { - - #line default - #line hidden - this.Write("\r\n public sealed class "); - - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name)); - - #line default - #line hidden - this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); - - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); - - #line default - #line hidden - this.Write(">\r\n {\r\n"); - - #line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if( objInfo.IsStringKey) { - - #line default - #line hidden - this.Write("\r\n readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping" + - ";\r\n readonly byte[][] ____stringByteKeys;\r\n\r\n public "); - - #line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name)); - - #line default - #line hidden - this.Write("Formatter()\r\n {\r\n this.____keyMapping = new global::MessagePack" + - ".Internal.AutomataDictionary()\r\n {\r\n"); - - #line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - foreach(var x in objInfo.Members) { - - #line default - #line hidden - this.Write(" { \""); - - #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey)); - - #line default - #line hidden - this.Write("\", "); - - #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); - - #line default - #line hidden - this.Write("},\r\n"); - - #line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" };\r\n\r\n this.____stringByteKeys = new byte[][]\r\n " + - " {\r\n"); - - #line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - foreach(var x in objInfo.Members.Where(x => x.IsReadable)) { - - #line default - #line hidden - this.Write(" global::MessagePack.MessagePackBinary.GetEncodedStringBytes(\""); - - #line 37 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey)); - - #line default - #line hidden - this.Write("\"),\r\n"); - - #line 38 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" \r\n };\r\n }\r\n\r\n"); - - #line 42 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write("\r\n public int Serialize(ref byte[] bytes, int offset, "); - - #line 44 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); - - #line default - #line hidden - this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n"); - - #line 46 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if( objInfo.IsClass) { - - #line default - #line hidden - this.Write(" if (value == null)\r\n {\r\n return global::Mes" + - "sagePack.MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n"); - - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" \r\n"); - - #line 52 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" -if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore) { - - #line default - #line hidden - this.Write(" ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(" + - ");\r\n"); - - #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { - - #line default - #line hidden - this.Write(" value.OnBeforeSerialize();\r\n"); - - #line 56 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" var startOffset = offset;\r\n"); - - #line 58 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if( objInfo.IsIntKey) { if( (objInfo.MaxKey + 1) <= 15) { - - #line default - #line hidden - this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeader" + - "Unsafe(ref bytes, offset, "); - - #line 59 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1)); - - #line default - #line hidden - this.Write(");\r\n"); - - #line 60 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else { - - #line default - #line hidden - this.Write(" offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref " + - "bytes, offset, "); - - #line 61 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1)); - - #line default - #line hidden - this.Write(");\r\n"); - - #line 62 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } } else if( objInfo.WriteCount <= 15) { - - #line default - #line hidden - this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUn" + - "safe(ref bytes, offset, "); - - #line 63 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount)); - - #line default - #line hidden - this.Write(");\r\n"); - - #line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else { - - #line default - #line hidden - this.Write(" offset += global::MessagePack.MessagePackBinary.WriteMapHeader(ref by" + - "tes, offset, "); - - #line 65 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount)); - - #line default - #line hidden - this.Write(");\r\n"); - - #line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - - #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if(objInfo.IsIntKey) { - - #line default - #line hidden - - #line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - for(var i =0; i<= objInfo.MaxKey; i++) { var member = objInfo.GetMember(i); - - #line default - #line hidden - - #line 69 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if( member == null) { - - #line default - #line hidden - this.Write(" offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, o" + - "ffset);\r\n"); - - #line 71 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else { - - #line default - #line hidden - this.Write(" offset += "); - - #line 72 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString())); - - #line default - #line hidden - this.Write(";\r\n"); - - #line 73 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } } } else { - - #line default - #line hidden - - #line 74 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - var index = 0; foreach(var x in objInfo.Members) { - - #line default - #line hidden - this.Write(" offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, o" + - "ffset, this.____stringByteKeys["); - - #line 75 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(index++)); - - #line default - #line hidden - this.Write("]);\r\n offset += "); - - #line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.GetSerializeMethodString())); - - #line default - #line hidden - this.Write(";\r\n"); - - #line 77 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } } - - #line default - #line hidden - this.Write(" return offset - startOffset;\r\n }\r\n\r\n public "); - - #line 81 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); - - #line default - #line hidden - this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" + - "matterResolver, out int readSize)\r\n {\r\n if (global::MessagePac" + - "k.MessagePackBinary.IsNil(bytes, offset))\r\n {\r\n"); - - #line 85 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if( objInfo.IsClass) { - - #line default - #line hidden - this.Write(" readSize = 1;\r\n return null;\r\n"); - - #line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else { - - #line default - #line hidden - this.Write(" throw new InvalidOperationException(\"typecode is null, struct not" + - " supported\");\r\n"); - - #line 90 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" }\r\n\r\n var startOffset = offset;\r\n"); - - #line 94 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if(objInfo.IsStringKey) { - - #line default - #line hidden - this.Write(" var length = global::MessagePack.MessagePackBinary.ReadMapHeader(byte" + - "s, offset, out readSize);\r\n"); - - #line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else { - - #line default - #line hidden - this.Write(" var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(by" + - "tes, offset, out readSize);\r\n"); - - #line 98 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" offset += readSize;\r\n\r\n"); - - #line 101 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - foreach(var x in objInfo.Members) { - - #line default - #line hidden - this.Write(" var __"); - - #line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); - - #line default - #line hidden - this.Write("__ = default("); - - #line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.Type)); - - #line default - #line hidden - this.Write(");\r\n"); - - #line 103 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write("\r\n for (int i = 0; i < length; i++)\r\n {\r\n"); - - #line 107 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if(objInfo.IsStringKey) { - - #line default - #line hidden - this.Write(@" var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); - offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } -"); - - #line 116 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else { - - #line default - #line hidden - this.Write(" var key = i;\r\n"); - - #line 118 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write("\r\n switch (key)\r\n {\r\n"); - - #line 122 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - foreach(var x in objInfo.Members) { - - #line default - #line hidden - this.Write(" case "); - - #line 123 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); - - #line default - #line hidden - this.Write(":\r\n __"); - - #line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); - - #line default - #line hidden - this.Write("__ = "); - - #line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.GetDeserializeMethodString())); - - #line default - #line hidden - this.Write(";\r\n break;\r\n"); - - #line 126 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" default:\r\n readSize = global::MessageP" + - "ack.MessagePackBinary.ReadNextBlock(bytes, offset);\r\n bre" + - "ak;\r\n }\r\n"); - - #line 131 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - if(objInfo.IsStringKey) { - - #line default - #line hidden - this.Write(" \r\n NEXT_LOOP:\r\n"); - - #line 133 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" offset += readSize;\r\n }\r\n\r\n readSize = offs" + - "et - startOffset;\r\n\r\n var ____result = new "); - - #line 139 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString())); - - #line default - #line hidden - this.Write(";\r\n"); - - #line 140 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { - - #line default - #line hidden - this.Write(" ____result."); - - #line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); - - #line default - #line hidden - this.Write(" = __"); - - #line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); - - #line default - #line hidden - this.Write("__;\r\n"); - - #line 142 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - - #line 143 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" -if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { - - #line default - #line hidden - this.Write(" ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeseri" + - "alize();\r\n"); - - #line 145 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { - - #line default - #line hidden - this.Write(" ____result.OnAfterDeserialize();\r\n"); - - #line 147 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write(" return ____result;\r\n }\r\n }\r\n\r\n"); - - #line 152 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - } - - #line default - #line hidden - this.Write("}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning re" + - "store 618\r\n#pragma warning restore 612"); - return this.GenerationEnvironment.ToString(); - } - } - - #line default - #line hidden - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public class FormatterTemplateBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - protected System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/src/MessagePack.CodeGenerator/Generator/FormatterTemplate.tt b/src/MessagePack.CodeGenerator/Generator/FormatterTemplate.tt deleted file mode 100644 index e05e432f4..000000000 --- a/src/MessagePack.CodeGenerator/Generator/FormatterTemplate.tt +++ /dev/null @@ -1,158 +0,0 @@ -<#@ template debug="false" hostspecific="false" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -#pragma warning disable 618 -#pragma warning disable 612 -#pragma warning disable 414 -#pragma warning disable 168 - -namespace <#= Namespace #> -{ - using System; - using MessagePack; - -<# foreach(var objInfo in objectSerializationInfos) { #> - - public sealed class <#= objInfo.Name #>Formatter : global::MessagePack.Formatters.IMessagePackFormatter<<#= objInfo.FullName #>> - { -<# if( objInfo.IsStringKey) { #> - - readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping; - readonly byte[][] ____stringByteKeys; - - public <#= objInfo.Name #>Formatter() - { - this.____keyMapping = new global::MessagePack.Internal.AutomataDictionary() - { -<# foreach(var x in objInfo.Members) { #> - { "<#= x.StringKey #>", <#= x.IntKey #>}, -<# } #> - }; - - this.____stringByteKeys = new byte[][] - { -<# foreach(var x in objInfo.Members.Where(x => x.IsReadable)) { #> - global::MessagePack.MessagePackBinary.GetEncodedStringBytes("<#= x.StringKey #>"), -<# } #> - }; - } - -<# } #> - - public int Serialize(ref byte[] bytes, int offset, <#= objInfo.FullName #> value, global::MessagePack.IFormatterResolver formatterResolver) - { -<# if( objInfo.IsClass) { #> - if (value == null) - { - return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); - } -<# } #> -<#if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore) { #> - ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(); -<# } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #> - value.OnBeforeSerialize(); -<# } #> - var startOffset = offset; -<# if( objInfo.IsIntKey) { if( (objInfo.MaxKey + 1) <= 15) { #> - offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, <#= objInfo.MaxKey + 1 #>); -<# } else { #> - offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref bytes, offset, <#= objInfo.MaxKey + 1 #>); -<# } } else if( objInfo.WriteCount <= 15) { #> - offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, <#= objInfo.WriteCount #>); -<# } else { #> - offset += global::MessagePack.MessagePackBinary.WriteMapHeader(ref bytes, offset, <#= objInfo.WriteCount #>); -<# } #> -<# if(objInfo.IsIntKey) { #> -<# for(var i =0; i<= objInfo.MaxKey; i++) { var member = objInfo.GetMember(i); #> -<# if( member == null) { #> - offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); -<# } else { #> - offset += <#= member.GetSerializeMethodString() #>; -<# } } } else { #> -<# var index = 0; foreach(var x in objInfo.Members) { #> - offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[<#= index++ #>]); - offset += <#= x.GetSerializeMethodString() #>; -<# } } #> - return offset - startOffset; - } - - public <#= objInfo.FullName #> Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) - { - if (global::MessagePack.MessagePackBinary.IsNil(bytes, offset)) - { -<# if( objInfo.IsClass) { #> - readSize = 1; - return null; -<# } else { #> - throw new InvalidOperationException("typecode is null, struct not supported"); -<# } #> - } - - var startOffset = offset; -<# if(objInfo.IsStringKey) { #> - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); -<# } else { #> - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); -<# } #> - offset += readSize; - -<# foreach(var x in objInfo.Members) { #> - var __<#= x.Name #>__ = default(<#= x.Type #>); -<# } #> - - for (int i = 0; i < length; i++) - { -<# if(objInfo.IsStringKey) { #> - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); - offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } -<# } else { #> - var key = i; -<# } #> - - switch (key) - { -<# foreach(var x in objInfo.Members) { #> - case <#= x.IntKey #>: - __<#= x.Name #>__ = <#= x.GetDeserializeMethodString() #>; - break; -<# } #> - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } -<# if(objInfo.IsStringKey) { #> - NEXT_LOOP: -<# } #> - offset += readSize; - } - - readSize = offset - startOffset; - - var ____result = new <#= objInfo.GetConstructorString() #>; -<# foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { #> - ____result.<#= x.Name #> = __<#= x.Name #>__; -<# } #> -<#if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { #> - ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); -<# } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #> - ____result.OnAfterDeserialize(); -<# } #> - return ____result; - } - } - -<# } #> -} - -#pragma warning restore 168 -#pragma warning restore 414 -#pragma warning restore 618 -#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/Generator/ResolverTemplate.cs b/src/MessagePack.CodeGenerator/Generator/ResolverTemplate.cs deleted file mode 100644 index 0e7d5d821..000000000 --- a/src/MessagePack.CodeGenerator/Generator/ResolverTemplate.cs +++ /dev/null @@ -1,455 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 -// -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 -// -// ------------------------------------------------------------------------------ -namespace MessagePack.CodeGenerator.Generator -{ - using System.Linq; - using System.Text; - using System.Collections.Generic; - using System; - - /// - /// Class to produce the template output - /// - - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public partial class ResolverTemplate : ResolverTemplateBase - { -#line hidden - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + - " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); - - #line default - #line hidden - this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n public class "); - - #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); - - #line default - #line hidden - this.Write(" : global::MessagePack.IFormatterResolver\r\n {\r\n public static readonly " + - "global::MessagePack.IFormatterResolver Instance = new "); - - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); - - #line default - #line hidden - this.Write("();\r\n\r\n "); - - #line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); - - #line default - #line hidden - this.Write(@"() - { - - } - - public global::MessagePack.Formatters.IMessagePackFormatter GetFormatter() - { - return FormatterCache.formatter; - } - - static class FormatterCache - { - public static readonly global::MessagePack.Formatters.IMessagePackFormatter formatter; - - static FormatterCache() - { - var f = "); - - #line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); - - #line default - #line hidden - this.Write(@"GetFormatterHelper.GetFormatter(typeof(T)); - if (f != null) - { - formatter = (global::MessagePack.Formatters.IMessagePackFormatter)f; - } - } - } - } - - internal static class "); - - #line 45 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); - - #line default - #line hidden - this.Write("GetFormatterHelper\r\n {\r\n static readonly global::System.Collections.Gen" + - "eric.Dictionary lookup;\r\n\r\n static "); - - #line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); - - #line default - #line hidden - this.Write("GetFormatterHelper()\r\n {\r\n lookup = new global::System.Collecti" + - "ons.Generic.Dictionary("); - - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(registerInfos.Length)); - - #line default - #line hidden - this.Write(")\r\n {\r\n"); - - #line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; - - #line default - #line hidden - this.Write(" {typeof("); - - #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.FullName)); - - #line default - #line hidden - this.Write("), "); - - #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(i)); - - #line default - #line hidden - this.Write(" },\r\n"); - - #line 55 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - } - - #line default - #line hidden - this.Write(" };\r\n }\r\n\r\n internal static object GetFormatter(Type t)\r" + - "\n {\r\n int key;\r\n if (!lookup.TryGetValue(t, out key" + - ")) return null;\r\n\r\n switch (key)\r\n {\r\n"); - - #line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; - - #line default - #line hidden - this.Write(" case "); - - #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(i)); - - #line default - #line hidden - this.Write(": return new "); - - #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(x.FormatterName.StartsWith("global::") ? x.FormatterName: (!string.IsNullOrEmpty(FormatterNamespace) ? FormatterNamespace + "." : FormatterNamespace) + x.FormatterName)); - - #line default - #line hidden - this.Write("();\r\n"); - - #line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - } - - #line default - #line hidden - this.Write(" default: return null;\r\n }\r\n }\r\n }\r\n}\r\n\r\n#pra" + - "gma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning restore 61" + - "8\r\n#pragma warning restore 612"); - return this.GenerationEnvironment.ToString(); - } - } - - #line default - #line hidden - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public class ResolverTemplateBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - protected System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/src/MessagePack.CodeGenerator/Generator/ResolverTemplate.tt b/src/MessagePack.CodeGenerator/Generator/ResolverTemplate.tt deleted file mode 100644 index a7511a363..000000000 --- a/src/MessagePack.CodeGenerator/Generator/ResolverTemplate.tt +++ /dev/null @@ -1,78 +0,0 @@ -<#@ template language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -#pragma warning disable 618 -#pragma warning disable 612 -#pragma warning disable 414 -#pragma warning disable 168 - -namespace <#= Namespace #> -{ - using System; - using MessagePack; - - public class <#= ResolverName #> : global::MessagePack.IFormatterResolver - { - public static readonly global::MessagePack.IFormatterResolver Instance = new <#= ResolverName #>(); - - <#= ResolverName #>() - { - - } - - public global::MessagePack.Formatters.IMessagePackFormatter GetFormatter() - { - return FormatterCache.formatter; - } - - static class FormatterCache - { - public static readonly global::MessagePack.Formatters.IMessagePackFormatter formatter; - - static FormatterCache() - { - var f = <#= ResolverName #>GetFormatterHelper.GetFormatter(typeof(T)); - if (f != null) - { - formatter = (global::MessagePack.Formatters.IMessagePackFormatter)f; - } - } - } - } - - internal static class <#= ResolverName #>GetFormatterHelper - { - static readonly global::System.Collections.Generic.Dictionary lookup; - - static <#= ResolverName #>GetFormatterHelper() - { - lookup = new global::System.Collections.Generic.Dictionary(<#= registerInfos.Length #>) - { -<# for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; #> - {typeof(<#= x.FullName #>), <#= i #> }, -<# } #> - }; - } - - internal static object GetFormatter(Type t) - { - int key; - if (!lookup.TryGetValue(t, out key)) return null; - - switch (key) - { -<# for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; #> - case <#= i #>: return new <#= x.FormatterName.StartsWith("global::") ? x.FormatterName: (!string.IsNullOrEmpty(FormatterNamespace) ? FormatterNamespace + "." : FormatterNamespace) + x.FormatterName#>(); -<# } #> - default: return null; - } - } - } -} - -#pragma warning restore 168 -#pragma warning restore 414 -#pragma warning restore 618 -#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/Generator/TemplatePartials.cs b/src/MessagePack.CodeGenerator/Generator/TemplatePartials.cs deleted file mode 100644 index 03d60a203..000000000 --- a/src/MessagePack.CodeGenerator/Generator/TemplatePartials.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MessagePack.CodeGenerator.Generator -{ - public partial class FormatterTemplate - { - public string Namespace; - public ObjectSerializationInfo[] objectSerializationInfos; - } - - public partial class ResolverTemplate - { - public string Namespace; - public string FormatterNamespace { get; set; } - public string ResolverName = "GeneratedResolver"; - public IResolverRegisterInfo[] registerInfos; - } - public partial class EnumTemplate - { - public string Namespace; - public EnumSerializationInfo[] enumSerializationInfos; - } - - public partial class UnionTemplate - { - public string Namespace; - public UnionSerializationInfo[] unionSerializationInfos; - } -} diff --git a/src/MessagePack.CodeGenerator/Generator/UnionTemplate.cs b/src/MessagePack.CodeGenerator/Generator/UnionTemplate.cs deleted file mode 100644 index 9b29e9012..000000000 --- a/src/MessagePack.CodeGenerator/Generator/UnionTemplate.cs +++ /dev/null @@ -1,584 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 -// -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 -// -// ------------------------------------------------------------------------------ -namespace MessagePack.CodeGenerator.Generator -{ - using System.Linq; - using System.Text; - using System.Collections.Generic; - using System; - - /// - /// Class to produce the template output - /// - - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public partial class UnionTemplate : UnionTemplateBase - { -#line hidden - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + - " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); - - #line default - #line hidden - this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using MessageP" + - "ack;\r\n\r\n"); - - #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - foreach(var info in unionSerializationInfos) { - - #line default - #line hidden - this.Write(" public sealed class "); - - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); - - #line default - #line hidden - this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); - - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(">\r\n {\r\n readonly Dictionary> " + - "typeToKeyAndJumpMap;\r\n readonly Dictionary keyToJumpMap;\r\n\r\n " + - " public "); - - #line 23 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); - - #line default - #line hidden - this.Write("Formatter()\r\n {\r\n this.typeToKeyAndJumpMap = new Dictionary>("); - - #line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length)); - - #line default - #line hidden - this.Write(", global::MessagePack.Internal.RuntimeTypeHandleEqualityComparer.Default)\r\n " + - " {\r\n"); - - #line 27 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; - - #line default - #line hidden - this.Write(" { typeof("); - - #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); - - #line default - #line hidden - this.Write(").TypeHandle, new KeyValuePair("); - - #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(item.Key)); - - #line default - #line hidden - this.Write(", "); - - #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(i)); - - #line default - #line hidden - this.Write(") },\r\n"); - - #line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - } - - #line default - #line hidden - this.Write(" };\r\n this.keyToJumpMap = new Dictionary("); - - #line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length)); - - #line default - #line hidden - this.Write(")\r\n {\r\n"); - - #line 33 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; - - #line default - #line hidden - this.Write(" { "); - - #line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(item.Key)); - - #line default - #line hidden - this.Write(", "); - - #line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(i)); - - #line default - #line hidden - this.Write(" },\r\n"); - - #line 35 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - } - - #line default - #line hidden - this.Write(" };\r\n }\r\n\r\n public int Serialize(ref byte[] bytes, int o" + - "ffset, "); - - #line 39 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(@" value, global::MessagePack.IFormatterResolver formatterResolver) - { - KeyValuePair keyValuePair; - if (value != null && this.typeToKeyAndJumpMap.TryGetValue(value.GetType().TypeHandle, out keyValuePair)) - { - var startOffset = offset; - offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); - offset += MessagePackBinary.WriteInt32(ref bytes, offset, keyValuePair.Key); - switch (keyValuePair.Value) - { -"); - - #line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; - - #line default - #line hidden - this.Write(" case "); - - #line 50 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(i)); - - #line default - #line hidden - this.Write(":\r\n offset += formatterResolver.GetFormatterWithVerify<"); - - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); - - #line default - #line hidden - this.Write(">().Serialize(ref bytes, offset, ("); - - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); - - #line default - #line hidden - this.Write(")value, formatterResolver);\r\n break;\r\n"); - - #line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - } - - #line default - #line hidden - this.Write(" default:\r\n break;\r\n }\r\n" + - "\r\n return offset - startOffset;\r\n }\r\n\r\n ret" + - "urn MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n \r\n " + - " public "); - - #line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(@" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) - { - if (MessagePackBinary.IsNil(bytes, offset)) - { - readSize = 1; - return null; - } - - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) - { - throw new InvalidOperationException(""Invalid Union data was detected. Type:"); - - #line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(@"""); - } - offset += readSize; - - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; - - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } - - "); - - #line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(" result = null;\r\n switch (key)\r\n {\r\n"); - - #line 91 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; - - #line default - #line hidden - this.Write(" case "); - - #line 92 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(i)); - - #line default - #line hidden - this.Write(":\r\n result = ("); - - #line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); - - #line default - #line hidden - this.Write(")formatterResolver.GetFormatterWithVerify<"); - - #line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); - - #line default - #line hidden - this.Write(">().Deserialize(bytes, offset, formatterResolver, out readSize);\r\n " + - " offset += readSize;\r\n break;\r\n"); - - #line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - } - - #line default - #line hidden - this.Write(@" default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } - - readSize = offset - startOffset; - - return result; - } - } - -"); - - #line 108 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - } - - #line default - #line hidden - this.Write("\r\n}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning " + - "restore 618\r\n#pragma warning restore 612"); - return this.GenerationEnvironment.ToString(); - } - } - - #line default - #line hidden - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public class UnionTemplateBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - protected System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/src/MessagePack.CodeGenerator/Generator/UnionTemplate.tt b/src/MessagePack.CodeGenerator/Generator/UnionTemplate.tt deleted file mode 100644 index e1578f896..000000000 --- a/src/MessagePack.CodeGenerator/Generator/UnionTemplate.tt +++ /dev/null @@ -1,115 +0,0 @@ -<#@ template debug="false" hostspecific="false" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -#pragma warning disable 618 -#pragma warning disable 612 -#pragma warning disable 414 -#pragma warning disable 168 - -namespace <#= Namespace #> -{ - using System; - using System.Collections.Generic; - using MessagePack; - -<# foreach(var info in unionSerializationInfos) { #> - public sealed class <#= info.Name #>Formatter : global::MessagePack.Formatters.IMessagePackFormatter<<#= info.FullName #>> - { - readonly Dictionary> typeToKeyAndJumpMap; - readonly Dictionary keyToJumpMap; - - public <#= info.Name #>Formatter() - { - this.typeToKeyAndJumpMap = new Dictionary>(<#= info.SubTypes.Length #>, global::MessagePack.Internal.RuntimeTypeHandleEqualityComparer.Default) - { -<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> - { typeof(<#= item.Type #>).TypeHandle, new KeyValuePair(<#= item.Key #>, <#= i #>) }, -<# } #> - }; - this.keyToJumpMap = new Dictionary(<#= info.SubTypes.Length #>) - { -<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> - { <#= item.Key #>, <#= i #> }, -<# } #> - }; - } - - public int Serialize(ref byte[] bytes, int offset, <#= info.FullName #> value, global::MessagePack.IFormatterResolver formatterResolver) - { - KeyValuePair keyValuePair; - if (value != null && this.typeToKeyAndJumpMap.TryGetValue(value.GetType().TypeHandle, out keyValuePair)) - { - var startOffset = offset; - offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); - offset += MessagePackBinary.WriteInt32(ref bytes, offset, keyValuePair.Key); - switch (keyValuePair.Value) - { -<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> - case <#= i #>: - offset += formatterResolver.GetFormatterWithVerify<<#= item.Type #>>().Serialize(ref bytes, offset, (<#= item.Type #>)value, formatterResolver); - break; -<# } #> - default: - break; - } - - return offset - startOffset; - } - - return MessagePackBinary.WriteNil(ref bytes, offset); - } - - public <#= info.FullName #> Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) - { - if (MessagePackBinary.IsNil(bytes, offset)) - { - readSize = 1; - return null; - } - - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) - { - throw new InvalidOperationException("Invalid Union data was detected. Type:<#= info.FullName #>"); - } - offset += readSize; - - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; - - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } - - <#= info.FullName #> result = null; - switch (key) - { -<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> - case <#= i #>: - result = (<#= info.FullName #>)formatterResolver.GetFormatterWithVerify<<#= item.Type #>>().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; -<# } #> - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } - - readSize = offset - startOffset; - - return result; - } - } - -<# } #> - -} - -#pragma warning restore 168 -#pragma warning restore 414 -#pragma warning restore 618 -#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj b/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj deleted file mode 100644 index ab293915b..000000000 --- a/src/MessagePack.CodeGenerator/MessagePack.CodeGenerator.csproj +++ /dev/null @@ -1,246 +0,0 @@ - - - - - Debug - AnyCPU - {D8B195AC-9E93-438E-8331-EF3A1F613D0B} - Exe - MessagePack.CodeGenerator - mpc - v4.6.1 - 512 - true - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll - - - ..\..\packages\Microsoft.Build.Framework.15.8.166\lib\net46\Microsoft.Build.Framework.dll - - - ..\..\packages\Microsoft.Build.MSBuildLocator.1.0.1-preview-g6cd9a57801\lib\net46\Microsoft.Build.MSBuildLocator.dll - - - ..\..\packages\Microsoft.Build.Tasks.Core.15.8.166\lib\net46\Microsoft.Build.Tasks.Core.dll - - - ..\..\packages\Microsoft.Build.Utilities.Core.15.8.166\lib\net46\Microsoft.Build.Utilities.Core.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Common.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - - - ..\..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Elfie.0.10.6-rc2\lib\net46\Microsoft.CodeAnalysis.Elfie.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.6.1\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll - - - ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.6.1\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll - - - ..\..\packages\Microsoft.VisualStudio.RemoteControl.14.0.262-masterA5CACE98\lib\net45\Microsoft.VisualStudio.RemoteControl.dll - - - ..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Interop.1.16.30\lib\net35\Microsoft.VisualStudio.Setup.Configuration.Interop.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Utilities.Internal.14.0.75-master5839BBFB\lib\net45\Microsoft.VisualStudio.Utilities.Internal.dll - - - - ..\..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - - - ..\..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll - - - - ..\..\packages\System.Composition.AttributedModel.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll - - - ..\..\packages\System.Composition.Convention.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll - - - ..\..\packages\System.Composition.Hosting.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll - - - ..\..\packages\System.Composition.Runtime.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll - - - ..\..\packages\System.Composition.TypedParts.1.0.31\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - - - - ..\..\packages\System.Console.4.3.0\lib\net46\System.Console.dll - - - - ..\..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - - - ..\..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll - - - ..\..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - - - ..\..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - - - ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - - - - - ..\..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - ..\..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - - - - - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll - - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - - - ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll - - - ..\..\packages\System.Threading.Tasks.Dataflow.4.5.24\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll - - - ..\..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll - - - ..\..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - - - - - - - - - - ..\..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll - - - ..\..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll - - - ..\..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll - - - ..\..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll - - - - - - - UnionTemplate.tt - True - True - - - True - True - EnumTemplate.tt - - - True - True - FormatterTemplate.tt - - - - True - True - ResolverTemplate.tt - - - - - - - - - - - - - - - - - - - - - - TextTemplatingFilePreprocessor - UnionTemplate.cs - - - TextTemplatingFilePreprocessor - EnumTemplate.cs - - - TextTemplatingFilePreprocessor - FormatterTemplate.cs - - - TextTemplatingFilePreprocessor - ResolverTemplate.cs - - - - - - このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。 - - - - \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/Mono.Options/Options.cs b/src/MessagePack.CodeGenerator/Mono.Options/Options.cs deleted file mode 100644 index 486b3ca8f..000000000 --- a/src/MessagePack.CodeGenerator/Mono.Options/Options.cs +++ /dev/null @@ -1,1463 +0,0 @@ -// -// Options.cs -// -// Authors: -// Jonathan Pryor -// Federico Di Gregorio -// Rolf Bjarne Kvinge -// -// Copyright (C) 2008 Novell (http://www.novell.com) -// Copyright (C) 2009 Federico Di Gregorio. -// Copyright (C) 2012 Xamarin Inc (http://www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -// Compile With: -// gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll -// gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll -// -// The LINQ version just changes the implementation of -// OptionSet.Parse(IEnumerable), and confers no semantic changes. - -// -// A Getopt::Long-inspired option parsing library for C#. -// -// NDesk.Options.OptionSet is built upon a key/value table, where the -// key is a option format string and the value is a delegate that is -// invoked when the format string is matched. -// -// Option format strings: -// Regex-like BNF Grammar: -// name: .+ -// type: [=:] -// sep: ( [^{}]+ | '{' .+ '}' )? -// aliases: ( name type sep ) ( '|' name type sep )* -// -// Each '|'-delimited name is an alias for the associated action. If the -// format string ends in a '=', it has a required value. If the format -// string ends in a ':', it has an optional value. If neither '=' or ':' -// is present, no value is supported. `=' or `:' need only be defined on one -// alias, but if they are provided on more than one they must be consistent. -// -// Each alias portion may also end with a "key/value separator", which is used -// to split option values if the option accepts > 1 value. If not specified, -// it defaults to '=' and ':'. If specified, it can be any character except -// '{' and '}' OR the *string* between '{' and '}'. If no separator should be -// used (i.e. the separate values should be distinct arguments), then "{}" -// should be used as the separator. -// -// Options are extracted either from the current option by looking for -// the option name followed by an '=' or ':', or is taken from the -// following option IFF: -// - The current option does not contain a '=' or a ':' -// - The current option requires a value (i.e. not a Option type of ':') -// -// The `name' used in the option format string does NOT include any leading -// option indicator, such as '-', '--', or '/'. All three of these are -// permitted/required on any named option. -// -// Option bundling is permitted so long as: -// - '-' is used to start the option group -// - all of the bundled options are a single character -// - at most one of the bundled options accepts a value, and the value -// provided starts from the next character to the end of the string. -// -// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' -// as '-Dname=value'. -// -// Option processing is disabled by specifying "--". All options after "--" -// are returned by OptionSet.Parse() unchanged and unprocessed. -// -// Unprocessed options are returned from OptionSet.Parse(). -// -// Examples: -// int verbose = 0; -// OptionSet p = new OptionSet () -// .Add ("v", v => ++verbose) -// .Add ("name=|value=", v => Console.WriteLine (v)); -// p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); -// -// The above would parse the argument string array, and would invoke the -// lambda expression three times, setting `verbose' to 3 when complete. -// It would also print out "A" and "B" to standard output. -// The returned array would contain the string "extra". -// -// C# 3.0 collection initializers are supported and encouraged: -// var p = new OptionSet () { -// { "h|?|help", v => ShowHelp () }, -// }; -// -// System.ComponentModel.TypeConverter is also supported, allowing the use of -// custom data types in the callback type; TypeConverter.ConvertFromString() -// is used to convert the value option to an instance of the specified -// type: -// -// var p = new OptionSet () { -// { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, -// }; -// -// Random other tidbits: -// - Boolean options (those w/o '=' or ':' in the option format string) -// are explicitly enabled if they are followed with '+', and explicitly -// disabled if they are followed with '-': -// string a = null; -// var p = new OptionSet () { -// { "a", s => a = s }, -// }; -// p.Parse (new string[]{"-a"}); // sets v != null -// p.Parse (new string[]{"-a+"}); // sets v != null -// p.Parse (new string[]{"-a-"}); // sets v == null -// - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Globalization; -using System.IO; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.Text; -using System.Text.RegularExpressions; - -#if LINQ -using System.Linq; -#endif - -#if TEST -using NDesk.Options; -#endif - -#if NDESK_OPTIONS -namespace NDesk.Options -#else -namespace Mono.Options -#endif -{ - static class StringCoda - { - - public static IEnumerable WrappedLines(string self, params int[] widths) - { - IEnumerable w = widths; - return WrappedLines(self, w); - } - - public static IEnumerable WrappedLines(string self, IEnumerable widths) - { - if (widths == null) - throw new ArgumentNullException("widths"); - return CreateWrappedLinesIterator(self, widths); - } - - private static IEnumerable CreateWrappedLinesIterator(string self, IEnumerable widths) - { - if (string.IsNullOrEmpty(self)) - { - yield return string.Empty; - yield break; - } - using (IEnumerator ewidths = widths.GetEnumerator()) - { - bool? hw = null; - int width = GetNextWidth(ewidths, int.MaxValue, ref hw); - int start = 0, end; - do - { - end = GetLineEnd(start, width, self); - char c = self[end - 1]; - if (char.IsWhiteSpace(c)) - --end; - bool needContinuation = end != self.Length && !IsEolChar(c); - string continuation = ""; - if (needContinuation) - { - --end; - continuation = "-"; - } - string line = self.Substring(start, end - start) + continuation; - yield return line; - start = end; - if (char.IsWhiteSpace(c)) - ++start; - width = GetNextWidth(ewidths, width, ref hw); - } while (start < self.Length); - } - } - - private static int GetNextWidth(IEnumerator ewidths, int curWidth, ref bool? eValid) - { - if (!eValid.HasValue || (eValid.HasValue && eValid.Value)) - { - curWidth = (eValid = ewidths.MoveNext()).Value ? ewidths.Current : curWidth; - // '.' is any character, - is for a continuation - const string minWidth = ".-"; - if (curWidth < minWidth.Length) - throw new ArgumentOutOfRangeException("widths", - string.Format("Element must be >= {0}, was {1}.", minWidth.Length, curWidth)); - return curWidth; - } - // no more elements, use the last element. - return curWidth; - } - - private static bool IsEolChar(char c) - { - return !char.IsLetterOrDigit(c); - } - - private static int GetLineEnd(int start, int length, string description) - { - int end = System.Math.Min(start + length, description.Length); - int sep = -1; - for (int i = start; i < end; ++i) - { - if (description[i] == '\n') - return i + 1; - if (IsEolChar(description[i])) - sep = i + 1; - } - if (sep == -1 || end == description.Length) - return end; - return sep; - } - } - - public class OptionValueCollection : IList, IList - { - - List values = new List(); - OptionContext c; - - internal OptionValueCollection(OptionContext c) - { - this.c = c; - } - - #region ICollection - void ICollection.CopyTo(Array array, int index) { (values as ICollection).CopyTo(array, index); } - bool ICollection.IsSynchronized { get { return (values as ICollection).IsSynchronized; } } - object ICollection.SyncRoot { get { return (values as ICollection).SyncRoot; } } - #endregion - - #region ICollection - public void Add(string item) { values.Add(item); } - public void Clear() { values.Clear(); } - public bool Contains(string item) { return values.Contains(item); } - public void CopyTo(string[] array, int arrayIndex) { values.CopyTo(array, arrayIndex); } - public bool Remove(string item) { return values.Remove(item); } - public int Count { get { return values.Count; } } - public bool IsReadOnly { get { return false; } } - #endregion - - #region IEnumerable - IEnumerator IEnumerable.GetEnumerator() { return values.GetEnumerator(); } - #endregion - - #region IEnumerable - public IEnumerator GetEnumerator() { return values.GetEnumerator(); } - #endregion - - #region IList - int IList.Add(object value) { return (values as IList).Add(value); } - bool IList.Contains(object value) { return (values as IList).Contains(value); } - int IList.IndexOf(object value) { return (values as IList).IndexOf(value); } - void IList.Insert(int index, object value) { (values as IList).Insert(index, value); } - void IList.Remove(object value) { (values as IList).Remove(value); } - void IList.RemoveAt(int index) { (values as IList).RemoveAt(index); } - bool IList.IsFixedSize { get { return false; } } - object IList.this[int index] { get { return this[index]; } set { (values as IList)[index] = value; } } - #endregion - - #region IList - public int IndexOf(string item) { return values.IndexOf(item); } - public void Insert(int index, string item) { values.Insert(index, item); } - public void RemoveAt(int index) { values.RemoveAt(index); } - - private void AssertValid(int index) - { - if (c.Option == null) - throw new InvalidOperationException("OptionContext.Option is null."); - if (index >= c.Option.MaxValueCount) - throw new ArgumentOutOfRangeException("index"); - if (c.Option.OptionValueType == OptionValueType.Required && - index >= values.Count) - throw new OptionException(string.Format( - c.OptionSet.MessageLocalizer("Missing required value for option '{0}'."), c.OptionName), - c.OptionName); - } - - public string this[int index] - { - get - { - AssertValid(index); - return index >= values.Count ? null : values[index]; - } - set - { - values[index] = value; - } - } - #endregion - - public List ToList() - { - return new List(values); - } - - public string[] ToArray() - { - return values.ToArray(); - } - - public override string ToString() - { - return string.Join(", ", values.ToArray()); - } - } - - public class OptionContext - { - private Option option; - private string name; - private int index; - private OptionSet set; - private OptionValueCollection c; - - public OptionContext(OptionSet set) - { - this.set = set; - this.c = new OptionValueCollection(this); - } - - public Option Option - { - get { return option; } - set { option = value; } - } - - public string OptionName - { - get { return name; } - set { name = value; } - } - - public int OptionIndex - { - get { return index; } - set { index = value; } - } - - public OptionSet OptionSet - { - get { return set; } - } - - public OptionValueCollection OptionValues - { - get { return c; } - } - } - - public enum OptionValueType - { - None, - Optional, - Required, - } - - public abstract class Option - { - string prototype, description; - string[] names; - OptionValueType type; - int count; - string[] separators; - bool hidden; - - protected Option(string prototype, string description) - : this(prototype, description, 1, false) - { - } - - protected Option(string prototype, string description, int maxValueCount) - : this(prototype, description, maxValueCount, false) - { - } - - protected Option(string prototype, string description, int maxValueCount, bool hidden) - { - if (prototype == null) - throw new ArgumentNullException("prototype"); - if (prototype.Length == 0) - throw new ArgumentException("Cannot be the empty string.", "prototype"); - if (maxValueCount < 0) - throw new ArgumentOutOfRangeException("maxValueCount"); - - this.prototype = prototype; - this.description = description; - this.count = maxValueCount; - this.names = (this is OptionSet.Category) - // append GetHashCode() so that "duplicate" categories have distinct - // names, e.g. adding multiple "" categories should be valid. - ? new[] { prototype + this.GetHashCode() } - : prototype.Split('|'); - - if (this is OptionSet.Category) - return; - - this.type = ParsePrototype(); - this.hidden = hidden; - - if (this.count == 0 && type != OptionValueType.None) - throw new ArgumentException( - "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + - "OptionValueType.Optional.", - "maxValueCount"); - if (this.type == OptionValueType.None && maxValueCount > 1) - throw new ArgumentException( - string.Format("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), - "maxValueCount"); - if (Array.IndexOf(names, "<>") >= 0 && - ((names.Length == 1 && this.type != OptionValueType.None) || - (names.Length > 1 && this.MaxValueCount > 1))) - throw new ArgumentException( - "The default option handler '<>' cannot require values.", - "prototype"); - } - - public string Prototype { get { return prototype; } } - public string Description { get { return description; } } - public OptionValueType OptionValueType { get { return type; } } - public int MaxValueCount { get { return count; } } - public bool Hidden { get { return hidden; } } - - public string[] GetNames() - { - return (string[])names.Clone(); - } - - public string[] GetValueSeparators() - { - if (separators == null) - return new string[0]; - return (string[])separators.Clone(); - } - - protected static T Parse(string value, OptionContext c) - { - Type tt = typeof(T); - bool nullable = tt.IsValueType && tt.IsGenericType && - !tt.IsGenericTypeDefinition && - tt.GetGenericTypeDefinition() == typeof(Nullable<>); - Type targetType = nullable ? tt.GetGenericArguments()[0] : typeof(T); - TypeConverter conv = TypeDescriptor.GetConverter(targetType); - T t = default(T); - try - { - if (value != null) - t = (T)conv.ConvertFromString(value); - } - catch (Exception e) - { - throw new OptionException( - string.Format( - c.OptionSet.MessageLocalizer("Could not convert string `{0}' to type {1} for option `{2}'."), - value, targetType.Name, c.OptionName), - c.OptionName, e); - } - return t; - } - - internal string[] Names { get { return names; } } - internal string[] ValueSeparators { get { return separators; } } - - static readonly char[] NameTerminator = new char[] { '=', ':' }; - - private OptionValueType ParsePrototype() - { - char type = '\0'; - List seps = new List(); - for (int i = 0; i < names.Length; ++i) - { - string name = names[i]; - if (name.Length == 0) - throw new ArgumentException("Empty option names are not supported.", "prototype"); - - int end = name.IndexOfAny(NameTerminator); - if (end == -1) - continue; - names[i] = name.Substring(0, end); - if (type == '\0' || type == name[end]) - type = name[end]; - else - throw new ArgumentException( - string.Format("Conflicting option types: '{0}' vs. '{1}'.", type, name[end]), - "prototype"); - AddSeparators(name, end, seps); - } - - if (type == '\0') - return OptionValueType.None; - - if (count <= 1 && seps.Count != 0) - throw new ArgumentException( - string.Format("Cannot provide key/value separators for Options taking {0} value(s).", count), - "prototype"); - if (count > 1) - { - if (seps.Count == 0) - this.separators = new string[] { ":", "=" }; - else if (seps.Count == 1 && seps[0].Length == 0) - this.separators = null; - else - this.separators = seps.ToArray(); - } - - return type == '=' ? OptionValueType.Required : OptionValueType.Optional; - } - - private static void AddSeparators(string name, int end, ICollection seps) - { - int start = -1; - for (int i = end + 1; i < name.Length; ++i) - { - switch (name[i]) - { - case '{': - if (start != -1) - throw new ArgumentException( - string.Format("Ill-formed name/value separator found in \"{0}\".", name), - "prototype"); - start = i + 1; - break; - case '}': - if (start == -1) - throw new ArgumentException( - string.Format("Ill-formed name/value separator found in \"{0}\".", name), - "prototype"); - seps.Add(name.Substring(start, i - start)); - start = -1; - break; - default: - if (start == -1) - seps.Add(name[i].ToString()); - break; - } - } - if (start != -1) - throw new ArgumentException( - string.Format("Ill-formed name/value separator found in \"{0}\".", name), - "prototype"); - } - - public void Invoke(OptionContext c) - { - OnParseComplete(c); - c.OptionName = null; - c.Option = null; - c.OptionValues.Clear(); - } - - protected abstract void OnParseComplete(OptionContext c); - - public override string ToString() - { - return Prototype; - } - } - - public abstract class ArgumentSource - { - - protected ArgumentSource() - { - } - - public abstract string[] GetNames(); - public abstract string Description { get; } - public abstract bool GetArguments(string value, out IEnumerable replacement); - - public static IEnumerable GetArgumentsFromFile(string file) - { - return GetArguments(File.OpenText(file), true); - } - - public static IEnumerable GetArguments(TextReader reader) - { - return GetArguments(reader, false); - } - - // Cribbed from mcs/driver.cs:LoadArgs(string) - static IEnumerable GetArguments(TextReader reader, bool close) - { - try - { - StringBuilder arg = new StringBuilder(); - - string line; - while ((line = reader.ReadLine()) != null) - { - int t = line.Length; - - for (int i = 0; i < t; i++) - { - char c = line[i]; - - if (c == '"' || c == '\'') - { - char end = c; - - for (i++; i < t; i++) - { - c = line[i]; - - if (c == end) - break; - arg.Append(c); - } - } - else if (c == ' ') - { - if (arg.Length > 0) - { - yield return arg.ToString(); - arg.Length = 0; - } - } - else - arg.Append(c); - } - if (arg.Length > 0) - { - yield return arg.ToString(); - arg.Length = 0; - } - } - } - finally - { - if (close) - reader.Close(); - } - } - } - - public class ResponseFileSource : ArgumentSource - { - - public override string[] GetNames() - { - return new string[] { "@file" }; - } - - public override string Description - { - get { return "Read response file for more options."; } - } - - public override bool GetArguments(string value, out IEnumerable replacement) - { - if (string.IsNullOrEmpty(value) || !value.StartsWith("@")) - { - replacement = null; - return false; - } - replacement = ArgumentSource.GetArgumentsFromFile(value.Substring(1)); - return true; - } - } - - [Serializable] - public class OptionException : Exception - { - private string option; - - public OptionException() - { - } - - public OptionException(string message, string optionName) - : base(message) - { - this.option = optionName; - } - - public OptionException(string message, string optionName, Exception innerException) - : base(message, innerException) - { - this.option = optionName; - } - - protected OptionException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - this.option = info.GetString("OptionName"); - } - - public string OptionName - { - get { return this.option; } - } - - [SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - info.AddValue("OptionName", option); - } - } - - public delegate void OptionAction(TKey key, TValue value); - - public class OptionSet : KeyedCollection - { - public OptionSet() - : this(delegate (string f) { return f; }) - { - } - - public OptionSet(Converter localizer) - { - this.localizer = localizer; - this.roSources = new ReadOnlyCollection(sources); - } - - Converter localizer; - - public Converter MessageLocalizer - { - get { return localizer; } - } - - List sources = new List(); - ReadOnlyCollection roSources; - - public ReadOnlyCollection ArgumentSources - { - get { return roSources; } - } - - - protected override string GetKeyForItem(Option item) - { - if (item == null) - throw new ArgumentNullException("option"); - if (item.Names != null && item.Names.Length > 0) - return item.Names[0]; - // This should never happen, as it's invalid for Option to be - // constructed w/o any names. - throw new InvalidOperationException("Option has no names!"); - } - - [Obsolete("Use KeyedCollection.this[string]")] - protected Option GetOptionForName(string option) - { - if (option == null) - throw new ArgumentNullException("option"); - try - { - return base[option]; - } - catch (KeyNotFoundException) - { - return null; - } - } - - protected override void InsertItem(int index, Option item) - { - base.InsertItem(index, item); - AddImpl(item); - } - - protected override void RemoveItem(int index) - { - Option p = Items[index]; - base.RemoveItem(index); - // KeyedCollection.RemoveItem() handles the 0th item - for (int i = 1; i < p.Names.Length; ++i) - { - Dictionary.Remove(p.Names[i]); - } - } - - protected override void SetItem(int index, Option item) - { - base.SetItem(index, item); - AddImpl(item); - } - - private void AddImpl(Option option) - { - if (option == null) - throw new ArgumentNullException("option"); - List added = new List(option.Names.Length); - try - { - // KeyedCollection.InsertItem/SetItem handle the 0th name. - for (int i = 1; i < option.Names.Length; ++i) - { - Dictionary.Add(option.Names[i], option); - added.Add(option.Names[i]); - } - } - catch (Exception) - { - foreach (string name in added) - Dictionary.Remove(name); - throw; - } - } - - public OptionSet Add(string header) - { - if (header == null) - throw new ArgumentNullException("header"); - Add(new Category(header)); - return this; - } - - internal sealed class Category : Option - { - - // Prototype starts with '=' because this is an invalid prototype - // (see Option.ParsePrototype(), and thus it'll prevent Category - // instances from being accidentally used as normal options. - public Category(string description) - : base("=:Category:= " + description, description) - { - } - - protected override void OnParseComplete(OptionContext c) - { - throw new NotSupportedException("Category.OnParseComplete should not be invoked."); - } - } - - - public new OptionSet Add(Option option) - { - base.Add(option); - return this; - } - - sealed class ActionOption : Option - { - Action action; - - public ActionOption(string prototype, string description, int count, Action action) - : this(prototype, description, count, action, false) - { - } - - public ActionOption(string prototype, string description, int count, Action action, bool hidden) - : base(prototype, description, count, hidden) - { - if (action == null) - throw new ArgumentNullException("action"); - this.action = action; - } - - protected override void OnParseComplete(OptionContext c) - { - action(c.OptionValues); - } - } - - public OptionSet Add(string prototype, Action action) - { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, Action action) - { - return Add(prototype, description, action, false); - } - - public OptionSet Add(string prototype, string description, Action action, bool hidden) - { - if (action == null) - throw new ArgumentNullException("action"); - Option p = new ActionOption(prototype, description, 1, - delegate (OptionValueCollection v) { action(v[0]); }, hidden); - base.Add(p); - return this; - } - - public OptionSet Add(string prototype, OptionAction action) - { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, OptionAction action) - { - return Add(prototype, description, action, false); - } - - public OptionSet Add(string prototype, string description, OptionAction action, bool hidden) - { - if (action == null) - throw new ArgumentNullException("action"); - Option p = new ActionOption(prototype, description, 2, - delegate (OptionValueCollection v) { action(v[0], v[1]); }, hidden); - base.Add(p); - return this; - } - - sealed class ActionOption : Option - { - Action action; - - public ActionOption(string prototype, string description, Action action) - : base(prototype, description, 1) - { - if (action == null) - throw new ArgumentNullException("action"); - this.action = action; - } - - protected override void OnParseComplete(OptionContext c) - { - action(Parse(c.OptionValues[0], c)); - } - } - - sealed class ActionOption : Option - { - OptionAction action; - - public ActionOption(string prototype, string description, OptionAction action) - : base(prototype, description, 2) - { - if (action == null) - throw new ArgumentNullException("action"); - this.action = action; - } - - protected override void OnParseComplete(OptionContext c) - { - action( - Parse(c.OptionValues[0], c), - Parse(c.OptionValues[1], c)); - } - } - - public OptionSet Add(string prototype, Action action) - { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, Action action) - { - return Add(new ActionOption(prototype, description, action)); - } - - public OptionSet Add(string prototype, OptionAction action) - { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, OptionAction action) - { - return Add(new ActionOption(prototype, description, action)); - } - - public OptionSet Add(ArgumentSource source) - { - if (source == null) - throw new ArgumentNullException("source"); - sources.Add(source); - return this; - } - - protected virtual OptionContext CreateOptionContext() - { - return new OptionContext(this); - } - - public List Parse(IEnumerable arguments) - { - if (arguments == null) - throw new ArgumentNullException("arguments"); - OptionContext c = CreateOptionContext(); - c.OptionIndex = -1; - bool process = true; - List unprocessed = new List(); - Option def = Contains("<>") ? this["<>"] : null; - ArgumentEnumerator ae = new ArgumentEnumerator(arguments); - foreach (string argument in ae) - { - ++c.OptionIndex; - if (argument == "--") - { - process = false; - continue; - } - if (!process) - { - Unprocessed(unprocessed, def, c, argument); - continue; - } - if (AddSource(ae, argument)) - continue; - if (!Parse(argument, c)) - Unprocessed(unprocessed, def, c, argument); - } - if (c.Option != null) - c.Option.Invoke(c); - return unprocessed; - } - - class ArgumentEnumerator : IEnumerable - { - List> sources = new List>(); - - public ArgumentEnumerator(IEnumerable arguments) - { - sources.Add(arguments.GetEnumerator()); - } - - public void Add(IEnumerable arguments) - { - sources.Add(arguments.GetEnumerator()); - } - - public IEnumerator GetEnumerator() - { - do - { - IEnumerator c = sources[sources.Count - 1]; - if (c.MoveNext()) - yield return c.Current; - else - { - c.Dispose(); - sources.RemoveAt(sources.Count - 1); - } - } while (sources.Count > 0); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - bool AddSource(ArgumentEnumerator ae, string argument) - { - foreach (ArgumentSource source in sources) - { - IEnumerable replacement; - if (!source.GetArguments(argument, out replacement)) - continue; - ae.Add(replacement); - return true; - } - return false; - } - - private static bool Unprocessed(ICollection extra, Option def, OptionContext c, string argument) - { - if (def == null) - { - extra.Add(argument); - return false; - } - c.OptionValues.Add(argument); - c.Option = def; - c.Option.Invoke(c); - return false; - } - - private readonly Regex ValueOption = new Regex( - @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); - - protected bool GetOptionParts(string argument, out string flag, out string name, out string sep, out string value) - { - if (argument == null) - throw new ArgumentNullException("argument"); - - flag = name = sep = value = null; - Match m = ValueOption.Match(argument); - if (!m.Success) - { - return false; - } - flag = m.Groups["flag"].Value; - name = m.Groups["name"].Value; - if (m.Groups["sep"].Success && m.Groups["value"].Success) - { - sep = m.Groups["sep"].Value; - value = m.Groups["value"].Value; - } - return true; - } - - protected virtual bool Parse(string argument, OptionContext c) - { - if (c.Option != null) - { - ParseValue(argument, c); - return true; - } - - string f, n, s, v; - if (!GetOptionParts(argument, out f, out n, out s, out v)) - return false; - - Option p; - if (Contains(n)) - { - p = this[n]; - c.OptionName = f + n; - c.Option = p; - switch (p.OptionValueType) - { - case OptionValueType.None: - c.OptionValues.Add(n); - c.Option.Invoke(c); - break; - case OptionValueType.Optional: - case OptionValueType.Required: - ParseValue(v, c); - break; - } - return true; - } - // no match; is it a bool option? - if (ParseBool(argument, n, c)) - return true; - // is it a bundled option? - if (ParseBundledValue(f, string.Concat(n + s + v), c)) - return true; - - return false; - } - - private void ParseValue(string option, OptionContext c) - { - if (option != null) - foreach (string o in c.Option.ValueSeparators != null - ? option.Split(c.Option.ValueSeparators, c.Option.MaxValueCount - c.OptionValues.Count, StringSplitOptions.None) - : new string[] { option }) - { - c.OptionValues.Add(o); - } - if (c.OptionValues.Count == c.Option.MaxValueCount || - c.Option.OptionValueType == OptionValueType.Optional) - c.Option.Invoke(c); - else if (c.OptionValues.Count > c.Option.MaxValueCount) - { - throw new OptionException(localizer(string.Format( - "Error: Found {0} option values when expecting {1}.", - c.OptionValues.Count, c.Option.MaxValueCount)), - c.OptionName); - } - } - - private bool ParseBool(string option, string n, OptionContext c) - { - Option p; - string rn; - if (n.Length >= 1 && (n[n.Length - 1] == '+' || n[n.Length - 1] == '-') && - Contains((rn = n.Substring(0, n.Length - 1)))) - { - p = this[rn]; - string v = n[n.Length - 1] == '+' ? option : null; - c.OptionName = option; - c.Option = p; - c.OptionValues.Add(v); - p.Invoke(c); - return true; - } - return false; - } - - private bool ParseBundledValue(string f, string n, OptionContext c) - { - if (f != "-") - return false; - for (int i = 0; i < n.Length; ++i) - { - Option p; - string opt = f + n[i].ToString(); - string rn = n[i].ToString(); - if (!Contains(rn)) - { - if (i == 0) - return false; - throw new OptionException(string.Format(localizer( - "Cannot bundle unregistered option '{0}'."), opt), opt); - } - p = this[rn]; - switch (p.OptionValueType) - { - case OptionValueType.None: - Invoke(c, opt, n, p); - break; - case OptionValueType.Optional: - case OptionValueType.Required: - { - string v = n.Substring(i + 1); - c.Option = p; - c.OptionName = opt; - ParseValue(v.Length != 0 ? v : null, c); - return true; - } - default: - throw new InvalidOperationException("Unknown OptionValueType: " + p.OptionValueType); - } - } - return true; - } - - private static void Invoke(OptionContext c, string name, string value, Option option) - { - c.OptionName = name; - c.Option = option; - c.OptionValues.Add(value); - option.Invoke(c); - } - - private const int OptionWidth = 29; - private const int Description_FirstWidth = 80 - OptionWidth; - private const int Description_RemWidth = 80 - OptionWidth - 2; - - public void WriteOptionDescriptions(TextWriter o) - { - foreach (Option p in this) - { - int written = 0; - - if (p.Hidden) - continue; - - Category c = p as Category; - if (c != null) - { - WriteDescription(o, p.Description, "", 80, 80); - continue; - } - - if (!WriteOptionPrototype(o, p, ref written)) - continue; - - if (written < OptionWidth) - o.Write(new string(' ', OptionWidth - written)); - else - { - o.WriteLine(); - o.Write(new string(' ', OptionWidth)); - } - - WriteDescription(o, p.Description, new string(' ', OptionWidth + 2), - Description_FirstWidth, Description_RemWidth); - } - - foreach (ArgumentSource s in sources) - { - string[] names = s.GetNames(); - if (names == null || names.Length == 0) - continue; - - int written = 0; - - Write(o, ref written, " "); - Write(o, ref written, names[0]); - for (int i = 1; i < names.Length; ++i) - { - Write(o, ref written, ", "); - Write(o, ref written, names[i]); - } - - if (written < OptionWidth) - o.Write(new string(' ', OptionWidth - written)); - else - { - o.WriteLine(); - o.Write(new string(' ', OptionWidth)); - } - - WriteDescription(o, s.Description, new string(' ', OptionWidth + 2), - Description_FirstWidth, Description_RemWidth); - } - } - - void WriteDescription(TextWriter o, string value, string prefix, int firstWidth, int remWidth) - { - bool indent = false; - foreach (string line in GetLines(localizer(GetDescription(value)), firstWidth, remWidth)) - { - if (indent) - o.Write(prefix); - o.WriteLine(line); - indent = true; - } - } - - bool WriteOptionPrototype(TextWriter o, Option p, ref int written) - { - string[] names = p.Names; - - int i = GetNextOptionIndex(names, 0); - if (i == names.Length) - return false; - - if (names[i].Length == 1) - { - Write(o, ref written, " -"); - Write(o, ref written, names[0]); - } - else - { - Write(o, ref written, " --"); - Write(o, ref written, names[0]); - } - - for (i = GetNextOptionIndex(names, i + 1); - i < names.Length; i = GetNextOptionIndex(names, i + 1)) - { - Write(o, ref written, ", "); - Write(o, ref written, names[i].Length == 1 ? "-" : "--"); - Write(o, ref written, names[i]); - } - - if (p.OptionValueType == OptionValueType.Optional || - p.OptionValueType == OptionValueType.Required) - { - if (p.OptionValueType == OptionValueType.Optional) - { - Write(o, ref written, localizer("[")); - } - Write(o, ref written, localizer("=" + GetArgumentName(0, p.MaxValueCount, p.Description))); - string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 - ? p.ValueSeparators[0] - : " "; - for (int c = 1; c < p.MaxValueCount; ++c) - { - Write(o, ref written, localizer(sep + GetArgumentName(c, p.MaxValueCount, p.Description))); - } - if (p.OptionValueType == OptionValueType.Optional) - { - Write(o, ref written, localizer("]")); - } - } - return true; - } - - static int GetNextOptionIndex(string[] names, int i) - { - while (i < names.Length && names[i] == "<>") - { - ++i; - } - return i; - } - - static void Write(TextWriter o, ref int n, string s) - { - n += s.Length; - o.Write(s); - } - - private static string GetArgumentName(int index, int maxIndex, string description) - { - if (description == null) - return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); - string[] nameStart; - if (maxIndex == 1) - nameStart = new string[] { "{0:", "{" }; - else - nameStart = new string[] { "{" + index + ":" }; - for (int i = 0; i < nameStart.Length; ++i) - { - int start, j = 0; - do - { - start = description.IndexOf(nameStart[i], j); - } while (start >= 0 && j != 0 ? description[j++ - 1] == '{' : false); - if (start == -1) - continue; - int end = description.IndexOf("}", start); - if (end == -1) - continue; - return description.Substring(start + nameStart[i].Length, end - start - nameStart[i].Length); - } - return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); - } - - private static string GetDescription(string description) - { - if (description == null) - return string.Empty; - StringBuilder sb = new StringBuilder(description.Length); - int start = -1; - for (int i = 0; i < description.Length; ++i) - { - switch (description[i]) - { - case '{': - if (i == start) - { - sb.Append('{'); - start = -1; - } - else if (start < 0) - start = i + 1; - break; - case '}': - if (start < 0) - { - if ((i + 1) == description.Length || description[i + 1] != '}') - throw new InvalidOperationException("Invalid option description: " + description); - ++i; - sb.Append("}"); - } - else - { - sb.Append(description.Substring(start, i - start)); - start = -1; - } - break; - case ':': - if (start < 0) - goto default; - start = i + 1; - break; - default: - if (start < 0) - sb.Append(description[i]); - break; - } - } - return sb.ToString(); - } - - private static IEnumerable GetLines(string description, int firstWidth, int remWidth) - { - return StringCoda.WrappedLines(description, firstWidth, remWidth); - } - } -} - diff --git a/src/MessagePack.CodeGenerator/Nuget.config b/src/MessagePack.CodeGenerator/Nuget.config deleted file mode 100644 index 9edcbd195..000000000 --- a/src/MessagePack.CodeGenerator/Nuget.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/MessagePack.CodeGenerator/Program.cs b/src/MessagePack.CodeGenerator/Program.cs deleted file mode 100644 index c53d9b91e..000000000 --- a/src/MessagePack.CodeGenerator/Program.cs +++ /dev/null @@ -1,179 +0,0 @@ -using MessagePack.CodeGenerator.Generator; -using Mono.Options; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MessagePack.CodeGenerator -{ - class CommandlineArguments - { - public string InputPath { get; private set; } - public string OutputPath { get; private set; } - public List ConditionalSymbols { get; private set; } - public string ResolverName { get; private set; } - public string NamespaceRoot { get; private set; } - public bool IsUseMap { get; private set; } - - public bool IsParsed { get; set; } - - public CommandlineArguments(string[] args) - { - ConditionalSymbols = new List(); - NamespaceRoot = "MessagePack"; - ResolverName = "GeneratedResolver"; - IsUseMap = false; - - var option = new OptionSet() - { - { "i|input=", "[required]Input path of analyze csproj", x => { InputPath = x; } }, - { "o|output=", "[required]Output file path", x => { OutputPath = x; } }, - { "c|conditionalsymbol=", "[optional, default=empty]conditional compiler symbol", x => { ConditionalSymbols.AddRange(x.Split(',')); } }, - { "r|resolvername=", "[optional, default=GeneratedResolver]Set resolver name", x => { ResolverName = x; } }, - { "n|namespace=", "[optional, default=MessagePack]Set namespace root name", x => { NamespaceRoot = x; } }, - { "m|usemapmode", "[optional, default=false]Force use map mode serialization", x => { IsUseMap = true; } }, - }; - if (args.Length == 0) - { - goto SHOW_HELP; - } - else - { - option.Parse(args); - - if (InputPath == null || OutputPath == null) - { - Console.WriteLine("Invalid Argument:" + string.Join(" ", args)); - Console.WriteLine(); - goto SHOW_HELP; - } - - IsParsed = true; - return; - } - - SHOW_HELP: - Console.WriteLine("mpc arguments help:"); - option.WriteOptionDescriptions(Console.Out); - IsParsed = false; - } - - public string GetNamespaceDot() - { - return string.IsNullOrWhiteSpace(NamespaceRoot) ? "" : NamespaceRoot + "."; - } - } - - - class Program - { - static void Main(string[] args) - { - var cmdArgs = new CommandlineArguments(args); - if (!cmdArgs.IsParsed) - { - return; - } - - // Generator Start... - - var sw = Stopwatch.StartNew(); - Console.WriteLine("Project Compilation Start:" + cmdArgs.InputPath); - - var collector = new TypeCollector(cmdArgs.InputPath, cmdArgs.ConditionalSymbols, true, cmdArgs.IsUseMap); - - Console.WriteLine("Project Compilation Complete:" + sw.Elapsed.ToString()); - Console.WriteLine(); - - sw.Restart(); - Console.WriteLine("Method Collect Start"); - - var (objectInfo, enumInfo, genericInfo, unionInfo) = collector.Collect(); - - Console.WriteLine("Method Collect Complete:" + sw.Elapsed.ToString()); - - Console.WriteLine("Output Generation Start"); - sw.Restart(); - - var objectFormatterTemplates = objectInfo - .GroupBy(x => x.Namespace) - .Select(x => new FormatterTemplate() - { - Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), - objectSerializationInfos = x.ToArray(), - }) - .ToArray(); - - var enumFormatterTemplates = enumInfo - .GroupBy(x => x.Namespace) - .Select(x => new EnumTemplate() - { - Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), - enumSerializationInfos = x.ToArray() - }) - .ToArray(); - - var unionFormatterTemplates = unionInfo - .GroupBy(x => x.Namespace) - .Select(x => new UnionTemplate() - { - Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), - unionSerializationInfos = x.ToArray() - }) - .ToArray(); - - var resolverTemplate = new ResolverTemplate() - { - Namespace = cmdArgs.GetNamespaceDot() + "Resolvers", - FormatterNamespace = cmdArgs.GetNamespaceDot() + "Formatters", - ResolverName = cmdArgs.ResolverName, - registerInfos = genericInfo.Cast().Concat(enumInfo).Concat(unionInfo).Concat(objectInfo).ToArray() - }; - - var sb = new StringBuilder(); - sb.AppendLine(resolverTemplate.TransformText()); - sb.AppendLine(); - foreach (var item in enumFormatterTemplates) - { - var text = item.TransformText(); - sb.AppendLine(text); - } - sb.AppendLine(); - foreach (var item in unionFormatterTemplates) - { - var text = item.TransformText(); - sb.AppendLine(text); - } - sb.AppendLine(); - foreach (var item in objectFormatterTemplates) - { - var text = item.TransformText(); - sb.AppendLine(text); - } - - Output(cmdArgs.OutputPath, sb.ToString()); - - Console.WriteLine("String Generation Complete:" + sw.Elapsed.ToString()); - } - - static void Output(string path, string text) - { - path = path.Replace("global::", ""); - - const string prefix = "[Out]"; - Console.WriteLine(prefix + path); - - var fi = new FileInfo(path); - if (!fi.Directory.Exists) - { - fi.Directory.Create(); - } - - System.IO.File.WriteAllText(path, text, Encoding.UTF8); - } - } -} diff --git a/src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs b/src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index 078a6efd6..000000000 --- a/src/MessagePack.CodeGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("MessagePack.CodeGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MessagePack.CodeGenerator")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから -// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります -[assembly: Guid("d8b195ac-9e93-438e-8331-ef3a1f613d0b")] - -// アセンブリのバージョン情報は次の 4 つの値で構成されています: -// -// メジャー バージョン -// マイナー バージョン -// ビルド番号 -// Revision -// -// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます -// 既定値にすることができます: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0.0")] -[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/src/MessagePack.CodeGenerator/Utils/EnvironmentHelper.cs b/src/MessagePack.CodeGenerator/Utils/EnvironmentHelper.cs deleted file mode 100644 index 4ed1f6386..000000000 --- a/src/MessagePack.CodeGenerator/Utils/EnvironmentHelper.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using Microsoft.Build.MSBuildLocator; - -namespace MessagePack.CodeGenerator -{ - internal static class EnvironmentHelper - { - /// - /// Setup the environment in order MSBuild to work - /// - public static void Setup() - { - if (IsMono) - { - SetupMsBuildPath(() => - { - return GetMonoMsBuildPath(monoDir => - { - Environment.SetEnvironmentVariable("MSBuildExtensionsPath", - Path.Combine(monoDir, "xbuild")); - }); - }); - return; - } - var vsInstallDir = Environment.GetEnvironmentVariable("VSINSTALLDIR"); - if (string.IsNullOrEmpty(vsInstallDir) || !Directory.Exists(vsInstallDir)) - { - var instance = MSBuildLocator.QueryVisualStudioInstances() - .OrderByDescending(o => o.Version) - .FirstOrDefault(); - if (instance != null) - { - MSBuildLocator.RegisterInstance(instance); - } - else - { - throw new InvalidOperationException( - "Visual Studio installation directory was not found. " + - "Install Visual Studio or set the environment variable VSINSTALLDIR"); - } - Environment.SetEnvironmentVariable("VSINSTALLDIR", instance.VisualStudioRootPath); - } - } - - public static bool IsMono => Type.GetType("Mono.Runtime") != null; - - public static bool IsNetCore => - RuntimeInformation.FrameworkDescription.StartsWith(".NET Core"); // .NET Core 4.6.00001.0 - - public static bool IsNetFramework => - RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework"); // .NET Framework 4.7.2115.0 - - // On Mono RuntimeInformation.IsOSPlatform will always retrun true for Windows - public static bool IsWindows => Path.DirectorySeparatorChar == '\\'; - - public static string GetConfigurationFilePath() - { - var name = AppDomain.CurrentDomain.FriendlyName; - // On .NET Core FriendlyName as only the assembly name without the extension - if (IsNetCore) - { - name += ".dll"; - } - name += ".config"; - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, name); - return File.Exists(path) ? path : null; - } - - public static string GetNetCoreMsBuildPath() - { - // Get the sdk path by using the .NET Core runtime assembly location - // Default locations: - // Windows -> C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.0\System.Private.CoreLib.dllz - // Linux -> /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/System.Private.CoreLib.dll - // OSX -> /usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/System.Private.CoreLib.dll - // MSBuild.dll is then located: - // Windows -> C:\Program Files\dotnet\sdk\2.0.0\MSBuild.dll - // Linux -> /usr/share/dotnet/sdk/2.0.0/MSBuild.dll - // OSX -> /usr/local/share/dotnet/sdk/2.0.0/MSBuild.dll - - var assembly = typeof(System.Runtime.GCSettings).Assembly; - var assemblyDirectory = Path.GetDirectoryName(assembly.Location); - var directoryInfo = new DirectoryInfo(assemblyDirectory); - var netCoreVersion = directoryInfo.Name; // e.g. 2.0.0 - // Get the dotnet folder - var dotnetFolder = directoryInfo.Parent.Parent.Parent.FullName; - // MSBuild should be located at dotnet/sdk/{version}/MSBuild.dll - var msBuildPath = Path.Combine(dotnetFolder, "sdk", netCoreVersion, "MSBuild.dll"); - return File.Exists(msBuildPath) ? msBuildPath : null; - } - - public static string GetMonoMsBuildPath(Action monoDirectoryAction = null) - { - // Get the sdk path by using the Mono runtime assembly location - // Default locations: - // Windows -> C:\Program Files (x86)\Mono\lib\mono\4.5\mscorlib.dll - // Linux -> /usr/lib/mono/4.5/mscorlib.dll - // OSX -> /Library/Frameworks/Mono.framework/Versions/5.2.0/lib/mono/4.5/mscorlib.dll - // MSBuild.dll is then located: - // Windows -> C:\Program Files (x86)\Mono\lib\mono\msbuild\15.0\bin\MSBuild.dll - // Linux -> /usr/lib/mono/msbuild/15.0/bin/MSBuild.dll - // OSX -> /Library/Frameworks/Mono.framework/Versions/5.2.0/lib/mono/msbuild/15.0/bin/MSBuild.dll - - var assembly = typeof(System.Runtime.GCSettings).Assembly; - var assemblyDirectory = Path.GetDirectoryName(assembly.Location); - var directoryInfo = new DirectoryInfo(assemblyDirectory).Parent; // get mono directory - monoDirectoryAction?.Invoke(directoryInfo.FullName); - var msBuildPath = Path.Combine(directoryInfo.FullName, "msbuild", "15.0", "bin", "MSBuild.dll"); - return File.Exists(msBuildPath) ? msBuildPath : null; - } - - private static void SetupMsBuildPath(Func getMsBuildPathFunc) - { - var msbuildPath = Environment.GetEnvironmentVariable("MSBUILD_EXE_PATH"); - if (!string.IsNullOrEmpty(msbuildPath) && File.Exists(msbuildPath)) - { - return; - } - msbuildPath = getMsBuildPathFunc(); - if (msbuildPath == null) - { - throw new InvalidOperationException( - "Environment variable MSBUILD_EXE_PATH is not set or is set incorrectly. " + - "Please set MSBUILD_EXE_PATH to point at MSBuild.dll."); - } - Environment.SetEnvironmentVariable("MSBUILD_EXE_PATH", msbuildPath); - } - } -} \ No newline at end of file diff --git a/src/MessagePack.CodeGenerator/Utils/RoslynExtensions.cs b/src/MessagePack.CodeGenerator/Utils/RoslynExtensions.cs deleted file mode 100644 index d243d9ae2..000000000 --- a/src/MessagePack.CodeGenerator/Utils/RoslynExtensions.cs +++ /dev/null @@ -1,190 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.MSBuild; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Xml.Linq; - -namespace MessagePack.CodeGenerator -{ - // Utility and Extension methods for Roslyn - internal static class RoslynExtensions - { - public static async Task GetCompilationFromProject(string csprojPath, params string[] preprocessorSymbols) - { - // fucking workaround of resolve reference... - var externalReferences = new List(); - { - var locations = new List(); - locations.Add(typeof(object).Assembly.Location); // mscorlib - locations.Add(typeof(System.Linq.Enumerable).Assembly.Location); // core - - var xElem = XElement.Load(csprojPath); - var ns = xElem.Name.Namespace; - - var csProjRoot = Path.GetDirectoryName(csprojPath); - var framworkRoot = Path.GetDirectoryName(typeof(object).Assembly.Location); - - foreach (var item in xElem.Descendants(ns + "Reference")) - { - var hintPath = item.Element(ns + "HintPath")?.Value; - if (hintPath == null) - { - var path = Path.Combine(framworkRoot, item.Attribute("Include").Value + ".dll"); - locations.Add(path); - } - else - { - locations.Add(Path.Combine(csProjRoot, hintPath)); - } - } - - foreach (var item in locations.Distinct()) - { - if (File.Exists(item)) - { - externalReferences.Add(MetadataReference.CreateFromFile(item)); - } - } - } - - EnvironmentHelper.Setup(); - - var workspace = MSBuildWorkspace.Create(); - workspace.WorkspaceFailed += Workspace_WorkspaceFailed; - - var project = await workspace.OpenProjectAsync(csprojPath).ConfigureAwait(false); - project = project.AddMetadataReferences(externalReferences); // workaround:) - project = project.WithParseOptions((project.ParseOptions as CSharpParseOptions).WithPreprocessorSymbols(preprocessorSymbols)); - - var compilation = await project.GetCompilationAsync().ConfigureAwait(false); - return compilation; - } - - private static void Workspace_WorkspaceFailed(object sender, WorkspaceDiagnosticEventArgs e) - { - Console.WriteLine(e.Diagnostic.ToString()); - // throw new Exception(e.Diagnostic.ToString()); - } - - public static IEnumerable GetNamedTypeSymbols(this Compilation compilation) - { - foreach (var syntaxTree in compilation.SyntaxTrees) - { - var semModel = compilation.GetSemanticModel(syntaxTree); - - foreach (var item in syntaxTree.GetRoot() - .DescendantNodes() - .Select(x => semModel.GetDeclaredSymbol(x)) - .Where(x => x != null)) - { - var namedType = item as INamedTypeSymbol; - if (namedType != null) - { - yield return namedType; - } - } - } - } - - public static IEnumerable EnumerateBaseType(this ITypeSymbol symbol) - { - var t = symbol.BaseType; - while (t != null) - { - yield return t; - t = t.BaseType; - } - } - - public static AttributeData FindAttribute(this IEnumerable attributeDataList, string typeName) - { - return attributeDataList - .Where(x => x.AttributeClass.ToDisplayString() == typeName) - .FirstOrDefault(); - } - - public static AttributeData FindAttributeShortName(this IEnumerable attributeDataList, string typeName) - { - return attributeDataList - .Where(x => x.AttributeClass.Name == typeName) - .FirstOrDefault(); - } - - public static AttributeData FindAttributeIncludeBasePropertyShortName(this IPropertySymbol property, string typeName) - { - do - { - var data = FindAttributeShortName(property.GetAttributes(), typeName); - if (data != null) return data; - property = property.OverriddenProperty; - } while (property != null); - - return null; - } - - public static AttributeSyntax FindAttribute(this BaseTypeDeclarationSyntax typeDeclaration, SemanticModel model, string typeName) - { - return typeDeclaration.AttributeLists - .SelectMany(x => x.Attributes) - .Where(x => model.GetTypeInfo(x).Type?.ToDisplayString() == typeName) - .FirstOrDefault(); - } - - public static INamedTypeSymbol FindBaseTargetType(this ITypeSymbol symbol, string typeName) - { - return symbol.EnumerateBaseType() - .Where(x => x.OriginalDefinition?.ToDisplayString() == typeName) - .FirstOrDefault(); - } - - public static object GetSingleNamedArgumentValue(this AttributeData attribute, string key) - { - foreach (var item in attribute.NamedArguments) - { - if (item.Key == key) - { - return item.Value.Value; - } - } - - return null; - } - - public static bool IsNullable(this INamedTypeSymbol symbol) - { - if (symbol.IsGenericType) - { - if (symbol.ConstructUnboundGenericType().ToDisplayString() == "T?") - { - return true; - } - } - return false; - } - - public static IEnumerable GetAllMembers(this ITypeSymbol symbol) - { - var t = symbol; - while (t != null) - { - foreach (var item in t.GetMembers()) - { - yield return item; - } - t = t.BaseType; - } - } - - public static IEnumerable GetAllInterfaceMembers(this ITypeSymbol symbol) - { - return symbol.GetMembers() - .Concat(symbol.AllInterfaces.SelectMany(x => x.GetMembers())); - } - } -} diff --git a/src/MessagePack.CodeGenerator/packages.config b/src/MessagePack.CodeGenerator/packages.config deleted file mode 100644 index 4bf5abbe9..000000000 --- a/src/MessagePack.CodeGenerator/packages.config +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MessagePack.UnityClient/Assembly-CSharp.csproj b/src/MessagePack.UnityClient/Assembly-CSharp.csproj new file mode 100644 index 000000000..3f956ef42 --- /dev/null +++ b/src/MessagePack.UnityClient/Assembly-CSharp.csproj @@ -0,0 +1,426 @@ + + + + 4 + + + Debug + AnyCPU + 10.0.20506 + 2.0 + + + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA} + Library + Properties + Assembly-CSharp + v3.5 + 512 + . + + + true + full + false + Temp\bin\Debug\ + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_3_0;UNITY_2018_3;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;UNITY_PRO_LICENSE + prompt + 4 + 0169 + True + + + pdbonly + true + Temp\bin\Release\ + prompt + 4 + 0169 + True + + + true + true + false + false + false + + + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Unity/VSTU + Game:1 + StandaloneWindows64:19 + 2018.3.0b7 + + + + C:\Program Files\Unity\Hub\Editor\2018.3.0b7\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Hub\Editor\2018.3.0b7\Editor\Data\Managed/UnityEditor.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/ScriptAssemblies/Unity.Analytics.Android.Editor.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/ScriptAssemblies/Unity.PackageManagerUI.Editor.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/ScriptAssemblies/Unity.TextMeshPro.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.BaselibModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.TimelineModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/Managed/Unity.Locator.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Assets/Scripts/Tests/MsgPack/MsgPack.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/PackageCache/com.unity.ads@2.0.8/UnityEngine.Advertisements.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/PackageCache/com.unity.analytics@3.0.9/Unity.Analytics.Editor.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/PackageCache/com.unity.analytics@3.0.9/Unity.Analytics.StandardEvents.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/PackageCache/com.unity.analytics@3.0.9/Unity.Analytics.Tracker.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/PackageCache/com.unity.analytics@3.0.9/Android/Unity.Analytics.dll + + + C:/GitHubRepositories/MessagePack-CSharp/src/MessagePack.UnityClient/Library/PackageCache/com.unity.purchasing@2.0.1/UnityEngine.Purchasing.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/mscorlib.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/System.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/System.Core.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/System.Runtime.Serialization.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/System.Xml.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/System.Xml.Linq.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/UnityScript.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/UnityScript.Lang.dll + + + C:/Program Files/Unity/Hub/Editor/2018.3.0b7/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/Boo.Lang.dll + + + + + + \ No newline at end of file diff --git a/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Shims/Reflection.cs b/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Shims/Reflection.cs index bf475d551..e41c67474 100644 --- a/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Shims/Reflection.cs +++ b/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Shims/Reflection.cs @@ -9,7 +9,7 @@ namespace System.Reflection { -#if !NET_4_6 +#if !NET_4_6 && !NET_STANDARD_2_0 public class TypeInfo { @@ -200,7 +200,7 @@ public IEnumerable GetCustomAttributes(bool inherit = true) public static class ReflectionExtensions { -#if !NET_4_6 +#if !NET_4_6 && !NET_STANDARD_2_0 public static TypeInfo GetTypeInfo(this Type type) { @@ -267,6 +267,7 @@ public static T GetCustomAttribute(this ConstructorInfo type, bool inherit) #else + public static bool IsConstructedGenericType(this TypeInfo type) { return type.IsConstructedGenericType; diff --git a/src/MessagePack.UnityClient/MessagePack.UnityClient.sln b/src/MessagePack.UnityClient/MessagePack.UnityClient.sln index e9da49ace..fcd35ef05 100644 --- a/src/MessagePack.UnityClient/MessagePack.UnityClient.sln +++ b/src/MessagePack.UnityClient/MessagePack.UnityClient.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2015 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UnityClient", "MessagePack.UnityClient.csproj", "{BB60E6A9-514B-4670-B176-DDDAB81A7468}" +# Visual Studio 15 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp.csproj", "{57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,10 +9,10 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB60E6A9-514B-4670-B176-DDDAB81A7468}.Release|Any CPU.Build.0 = Release|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57B7A568-FAC6-6E41-92BE-735D1F0B6CFA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/MessagePack.UnityClient/ProjectSettings/PresetManager.asset b/src/MessagePack.UnityClient/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..e58f57cea29a22fe2c05cfb99e4a9a7b6d6babda GIT binary patch literal 4104 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 Aga7~l literal 52147 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 literal 4116 zcmeH~yH3ME5JhL5@Cxr&MN2_LBtRsTK?n&XP(UFiLRK)rD459JAce{W4c|aPM@NJB z0DgmphK@g=!Q5**Arh&ncBS#ooE_g?U2kI%%NLoN6Ol>Gm_*j|Yx!bxRlcJrQVO7e z$3yP!ZT7|gn)z64e%?PVO@rSexXw`&3DF zN616+j9Nj)AkP7-5_wkM!4~ii&p1jRM^+BOFA%K9y4(`#Yt+;k$1JaZ^(TP)>Emnl z)#oSVK2^`v?X4@%b85QcXzhCSAb|%hzjkg109}50a^wVh|LW99S~fkq(bjG)=;_#n zpldhW8>j45wC(FwQ;i^s2t<%@_06X-6* z8PsdYS>za!L!kPAMgld@M-=lFk3(k%{Z#)uNP>qtSuoa#A~}Y2CKMahnH=y?=L|jT z@H;q$b*2>?)rk$bpaYz5^f1ZaUYjJ2##*udK3kGgQAgY?N(R zUV0$`*tcu)Fpt8pyen1Yn$B(Zrc#maV90E`e;cQ=0WrgNq$xemZd6;ms-)VoT(IlX z^rVCS*lOox&9fM(TdITOqaXYy)S(^F4rm9o1KI)YfObGTpdHW-Xa}?d|L;Jz(@DR- H9qs-CliqYv literal 4116 zcmeH~%}T>S6ov0JYW=BI!JXTRyMis!ZM!I1P*iGlB@#)LNSl;qy3kc#!52{6xYvb` z;?g(Kc+MnMM4v!r;LhCp&CSW=%qk*<8Ik2x5m~~DMP#d5uQrA?`AE}LDS!&5+n1;M zL-FM9b^Z9h^xi9%!CeIRIT|7f`cqRRE$T_v7nQ`jZP?Aj}IHOG zR|wW~Up&*tp3$Gj`j`F!`M!QJ7Y6#e<;7iJ>ma<0WpLI33fz8h@B7|C-_;kkS suBiO_CL4CO4p;}Q1J(iSfOWt+U>&dySO=^F)`9=!0RH{>OFa3gPohF&3jhEB diff --git a/src/MessagePack.UnityClient/UnityPackageManager/manifest.json b/src/MessagePack.UnityClient/UnityPackageManager/manifest.json deleted file mode 100644 index 526aca605..000000000 --- a/src/MessagePack.UnityClient/UnityPackageManager/manifest.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "dependencies": { - } -} diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj index bdf2cf937..53db88fc3 100644 --- a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj @@ -3,6 +3,8 @@ Exe netcoreapp2.1 + mpc + MessagePack.CodeGenerator diff --git a/src/MessagePack/Internal/AutomataDictionary.cs b/src/MessagePack/Internal/AutomataDictionary.cs index 42808e8f3..aa3c82539 100644 --- a/src/MessagePack/Internal/AutomataDictionary.cs +++ b/src/MessagePack/Internal/AutomataDictionary.cs @@ -172,11 +172,15 @@ static IEnumerable> YieldCore(IEnumerable> onFound, Action onNotFound) { root.EmitSearchNext(il, p, rest, key, onFound, onNotFound); } +#endif + class AutomataNode : IComparable { static readonly AutomataNode[] emptyNodes = new AutomataNode[0]; @@ -334,6 +338,8 @@ public IEnumerable YieldChildren() } } +#if !NET_STANDARD_2_0 + // SearchNext(ref byte* p, ref int rest, ref ulong key) public void EmitSearchNext(ILGenerator il, LocalBuilder p, LocalBuilder rest, LocalBuilder key, Action> onFound, Action onNotFound) { @@ -453,6 +459,8 @@ static void EmitSearchNextCore(ILGenerator il, LocalBuilder p, LocalBuilder rest EmitSearchNextCore(il, p, rest, key, onFound, onNotFound, r, r.Length); } } + +#endif } } @@ -466,6 +474,8 @@ public static class AutomataKeyGen #if !NETSTANDARD +#if !NET_STANDARD_2_0 + static MethodInfo dynamicGetKeyMethod; static readonly object gate = new object(); static DynamicAssembly dynamicAssembly; @@ -679,7 +689,9 @@ public static MethodInfo GetGetKeyMethod() return dynamicGetKeyMethod; } - + +#endif + #endif #if NETSTANDARD diff --git a/src/MessagePack/Internal/DynamicAssembly.cs b/src/MessagePack/Internal/DynamicAssembly.cs index 4891f876b..e7fd22856 100644 --- a/src/MessagePack/Internal/DynamicAssembly.cs +++ b/src/MessagePack/Internal/DynamicAssembly.cs @@ -1,4 +1,5 @@ #if !UNITY_WSA +#if !NET_STANDARD_2_0 using System; using System.Reflection; @@ -74,4 +75,5 @@ public AssemblyBuilder Save() } } +#endif #endif \ No newline at end of file diff --git a/src/MessagePack/Internal/ILGeneratorExtensions.cs b/src/MessagePack/Internal/ILGeneratorExtensions.cs index f2e7eb665..2ce4f963c 100644 --- a/src/MessagePack/Internal/ILGeneratorExtensions.cs +++ b/src/MessagePack/Internal/ILGeneratorExtensions.cs @@ -1,4 +1,5 @@ #if !UNITY_WSA +#if !NET_STANDARD_2_0 using System; using System.Linq; @@ -390,4 +391,5 @@ public static void EmitIncrementFor(this ILGenerator il, LocalBuilder conditionG } +#endif #endif \ No newline at end of file diff --git a/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs b/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs index c27887b90..f9d114f68 100644 --- a/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs +++ b/src/MessagePack/Resolvers/ContractlessReflectionObjectResolver.cs @@ -8,296 +8,298 @@ namespace MessagePack.Resolvers { - public static class ContractlessReflectionObjectResolver - { - // TODO:CamelCase Option? AllowPrivate? - public static readonly IFormatterResolver Default = new DefaultResolver(); - public static readonly IFormatterResolver Contractless = new ContractlessResolver(); - public static readonly IFormatterResolver ContractlessForceStringKey = new ContractlessForceStringResolver(); - - class DefaultResolver : IFormatterResolver - { - const bool ForceStringKey = false; - const bool Contractless = false; - const bool AllowPrivate = false; - - public IMessagePackFormatter GetFormatter() - { - return Cache.formatter; - } - - static class Cache - { - public static readonly IMessagePackFormatter formatter; - - static Cache() - { - var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); - if (metaInfo != null) - { - formatter = new ReflectionObjectFormatter(metaInfo); - } - } - } - } - - class ContractlessResolver : IFormatterResolver - { - const bool ForceStringKey = false; - const bool Contractless = true; - const bool AllowPrivate = false; - - public IMessagePackFormatter GetFormatter() - { - return Cache.formatter; - } - - static class Cache - { - public static readonly IMessagePackFormatter formatter; - - static Cache() - { - var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); - if (metaInfo != null) - { - formatter = new ReflectionObjectFormatter(metaInfo); - } - } - } - } - - class ContractlessForceStringResolver : IFormatterResolver - { - const bool ForceStringKey = true; - const bool Contractless = true; - const bool AllowPrivate = false; - - public IMessagePackFormatter GetFormatter() - { - return Cache.formatter; - } - - static class Cache - { - public static readonly IMessagePackFormatter formatter; - - static Cache() - { - var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); - if (metaInfo != null) - { - formatter = new ReflectionObjectFormatter(metaInfo); - } - } - } - } - - } - - - public class ReflectionObjectFormatter : IMessagePackFormatter - { - readonly ObjectSerializationInfo metaInfo; - - // for write - readonly byte[][] writeMemberNames; - readonly ObjectSerializationInfo.EmittableMember[] writeMembers; - - // for read - readonly int[] constructorParameterIndexes; - readonly AutomataDictionary mapMemberDictionary; - readonly ObjectSerializationInfo.EmittableMember[] readMembers; - - - internal ReflectionObjectFormatter(ObjectSerializationInfo metaInfo) - { - this.metaInfo = metaInfo; - - // for write - { - var memberNameList = new List(metaInfo.Members.Length); - var emmitableMemberList = new List(metaInfo.Members.Length); - foreach (var item in metaInfo.Members) - { - if (item.IsWritable) - { - emmitableMemberList.Add(item); - memberNameList.Add(Encoding.UTF8.GetBytes(item.Name)); - } - } - this.writeMemberNames = memberNameList.ToArray(); - this.writeMembers = emmitableMemberList.ToArray(); - } - // for read - { - var automata = new AutomataDictionary(); - var emmitableMemberList = new List(metaInfo.Members.Length); - int index = 0; - foreach (var item in metaInfo.Members) - { - if (item.IsReadable) - { - emmitableMemberList.Add(item); - automata.Add(item.Name, index++); - } - } - this.readMembers = emmitableMemberList.ToArray(); - this.mapMemberDictionary = automata; - } - } - - public int Serialize(ref byte[] bytes, int offset, T value, IFormatterResolver formatterResolver) - { - // reduce generic method size, avoid write code in type. - if (metaInfo.IsIntKey) - { - return ReflectionObjectFormatterHelper.WriteArraySerialize(metaInfo, writeMembers, ref bytes, offset, value, formatterResolver); - } - else - { - return ReflectionObjectFormatterHelper.WriteMapSerialize(metaInfo, writeMembers, writeMemberNames, ref bytes, offset, value, formatterResolver); - } - } - - public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) - { - return (T)ReflectionObjectFormatterHelper.Deserialize(metaInfo, readMembers, constructorParameterIndexes, mapMemberDictionary, bytes, offset, formatterResolver, out readSize); - } - } - - internal static class ReflectionObjectFormatterHelper - { - internal static int WriteArraySerialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] writeMembers, ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver) - { - var startOffset = offset; - - offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, writeMembers.Length); - foreach (var item in metaInfo.Members) - { - if (item == null) - { - offset += MessagePackBinary.WriteNil(ref bytes, offset); - } - else - { - var memberValue = item.ReflectionLoadValue(value); - offset += MessagePackSerializer.NonGeneric.Serialize(item.Type, ref bytes, offset, memberValue, formatterResolver); - } - } - - return offset - startOffset; - } - - internal static int WriteMapSerialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] writeMembers, byte[][] memberNames, ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver) - { - var startOffset = offset; - - offset += MessagePackBinary.WriteMapHeader(ref bytes, offset, writeMembers.Length); - - for (int i = 0; i < writeMembers.Length; i++) - { - offset += MessagePackBinary.WriteStringBytes(ref bytes, offset, memberNames[i]); - var memberValue = writeMembers[i].ReflectionLoadValue(value); - offset += MessagePackSerializer.NonGeneric.Serialize(writeMembers[i].Type, ref bytes, offset, memberValue, formatterResolver); - } - - return offset - startOffset; - } - - internal static object Deserialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] readMembers, int[] constructorParameterIndexes, AutomataDictionary mapMemberDictionary, byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) - { - var startOffset = offset; - object[] parameters = null; - - var headerType = MessagePackBinary.GetMessagePackType(bytes, offset); - if (headerType == MessagePackType.Nil) - { - readSize = 1; - return null; - } - else if (headerType == MessagePackType.Array) - { - var arraySize = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - // ReadValues - parameters = new object[arraySize]; - for (int i = 0; i < arraySize; i++) - { - var info = readMembers[i]; - if (info != null) - { - parameters[i] = MessagePackSerializer.NonGeneric.Deserialize(info.Type, bytes, offset, formatterResolver, out readSize); - offset += readSize; - } - else - { - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - } - } - } - else if (headerType == MessagePackType.Map) - { - var mapSize = MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - // ReadValues - parameters = new object[mapSize]; - for (int i = 0; i < mapSize; i++) - { - var rawPropName = MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); - offset += readSize; - - int index; - if (mapMemberDictionary.TryGetValue(rawPropName.Array, rawPropName.Offset, rawPropName.Count, out index)) - { - var info = readMembers[index]; - parameters[index] = MessagePackSerializer.NonGeneric.Deserialize(info.Type, bytes, offset, formatterResolver, out readSize); - offset += readSize; - } - else - { - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - } - } - } - else - { - throw new InvalidOperationException("Invalid MessagePackType:" + MessagePackCode.ToFormatName(bytes[offset])); - } - - // CreateObject - object result = null; - if (constructorParameterIndexes.Length == 0) - { - result = Activator.CreateInstance(metaInfo.Type); - } - else - { - var args = new object[constructorParameterIndexes.Length]; - for (int i = 0; i < constructorParameterIndexes.Length; i++) - { - args[i] = parameters[constructorParameterIndexes[i]]; - } - - result = Activator.CreateInstance(metaInfo.Type, args); - } - - // SetMembers - for (int i = 0; i < readMembers.Length; i++) - { - var info = readMembers[i]; - if (info != null) - { - info.ReflectionStoreValue(result, parameters[i]); - } - } - - readSize = offset - startOffset; - return result; - } - } + // MEMO: Not completely implemented. + + //public static class ContractlessReflectionObjectResolver + //{ + // // TODO:CamelCase Option? AllowPrivate? + // public static readonly IFormatterResolver Default = new DefaultResolver(); + // public static readonly IFormatterResolver Contractless = new ContractlessResolver(); + // public static readonly IFormatterResolver ContractlessForceStringKey = new ContractlessForceStringResolver(); + + // class DefaultResolver : IFormatterResolver + // { + // const bool ForceStringKey = false; + // const bool Contractless = false; + // const bool AllowPrivate = false; + + // public IMessagePackFormatter GetFormatter() + // { + // return Cache.formatter; + // } + + // static class Cache + // { + // public static readonly IMessagePackFormatter formatter; + + // static Cache() + // { + // var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); + // if (metaInfo != null) + // { + // formatter = new ReflectionObjectFormatter(metaInfo); + // } + // } + // } + // } + + // class ContractlessResolver : IFormatterResolver + // { + // const bool ForceStringKey = false; + // const bool Contractless = true; + // const bool AllowPrivate = false; + + // public IMessagePackFormatter GetFormatter() + // { + // return Cache.formatter; + // } + + // static class Cache + // { + // public static readonly IMessagePackFormatter formatter; + + // static Cache() + // { + // var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); + // if (metaInfo != null) + // { + // formatter = new ReflectionObjectFormatter(metaInfo); + // } + // } + // } + // } + + // class ContractlessForceStringResolver : IFormatterResolver + // { + // const bool ForceStringKey = true; + // const bool Contractless = true; + // const bool AllowPrivate = false; + + // public IMessagePackFormatter GetFormatter() + // { + // return Cache.formatter; + // } + + // static class Cache + // { + // public static readonly IMessagePackFormatter formatter; + + // static Cache() + // { + // var metaInfo = ObjectSerializationInfo.CreateOrNull(typeof(T), ForceStringKey, Contractless, AllowPrivate); + // if (metaInfo != null) + // { + // formatter = new ReflectionObjectFormatter(metaInfo); + // } + // } + // } + // } + + //} + + + //public class ReflectionObjectFormatter : IMessagePackFormatter + //{ + // readonly ObjectSerializationInfo metaInfo; + + // // for write + // readonly byte[][] writeMemberNames; + // readonly ObjectSerializationInfo.EmittableMember[] writeMembers; + + // // for read + // readonly int[] constructorParameterIndexes; + // readonly AutomataDictionary mapMemberDictionary; + // readonly ObjectSerializationInfo.EmittableMember[] readMembers; + + + // internal ReflectionObjectFormatter(ObjectSerializationInfo metaInfo) + // { + // this.metaInfo = metaInfo; + + // // for write + // { + // var memberNameList = new List(metaInfo.Members.Length); + // var emmitableMemberList = new List(metaInfo.Members.Length); + // foreach (var item in metaInfo.Members) + // { + // if (item.IsWritable) + // { + // emmitableMemberList.Add(item); + // memberNameList.Add(Encoding.UTF8.GetBytes(item.Name)); + // } + // } + // this.writeMemberNames = memberNameList.ToArray(); + // this.writeMembers = emmitableMemberList.ToArray(); + // } + // // for read + // { + // var automata = new AutomataDictionary(); + // var emmitableMemberList = new List(metaInfo.Members.Length); + // int index = 0; + // foreach (var item in metaInfo.Members) + // { + // if (item.IsReadable) + // { + // emmitableMemberList.Add(item); + // automata.Add(item.Name, index++); + // } + // } + // this.readMembers = emmitableMemberList.ToArray(); + // this.mapMemberDictionary = automata; + // } + // } + + // public int Serialize(ref byte[] bytes, int offset, T value, IFormatterResolver formatterResolver) + // { + // // reduce generic method size, avoid write code in type. + // if (metaInfo.IsIntKey) + // { + // return ReflectionObjectFormatterHelper.WriteArraySerialize(metaInfo, writeMembers, ref bytes, offset, value, formatterResolver); + // } + // else + // { + // return ReflectionObjectFormatterHelper.WriteMapSerialize(metaInfo, writeMembers, writeMemberNames, ref bytes, offset, value, formatterResolver); + // } + // } + + // public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) + // { + // return (T)ReflectionObjectFormatterHelper.Deserialize(metaInfo, readMembers, constructorParameterIndexes, mapMemberDictionary, bytes, offset, formatterResolver, out readSize); + // } + //} + + //internal static class ReflectionObjectFormatterHelper + //{ + // internal static int WriteArraySerialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] writeMembers, ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver) + // { + // var startOffset = offset; + + // offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, writeMembers.Length); + // foreach (var item in metaInfo.Members) + // { + // if (item == null) + // { + // offset += MessagePackBinary.WriteNil(ref bytes, offset); + // } + // else + // { + // var memberValue = item.ReflectionLoadValue(value); + // offset += MessagePackSerializer.NonGeneric.Serialize(item.Type, ref bytes, offset, memberValue, formatterResolver); + // } + // } + + // return offset - startOffset; + // } + + // internal static int WriteMapSerialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] writeMembers, byte[][] memberNames, ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver) + // { + // var startOffset = offset; + + // offset += MessagePackBinary.WriteMapHeader(ref bytes, offset, writeMembers.Length); + + // for (int i = 0; i < writeMembers.Length; i++) + // { + // offset += MessagePackBinary.WriteStringBytes(ref bytes, offset, memberNames[i]); + // var memberValue = writeMembers[i].ReflectionLoadValue(value); + // offset += MessagePackSerializer.NonGeneric.Serialize(writeMembers[i].Type, ref bytes, offset, memberValue, formatterResolver); + // } + + // return offset - startOffset; + // } + + // internal static object Deserialize(ObjectSerializationInfo metaInfo, ObjectSerializationInfo.EmittableMember[] readMembers, int[] constructorParameterIndexes, AutomataDictionary mapMemberDictionary, byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) + // { + // var startOffset = offset; + // object[] parameters = null; + + // var headerType = MessagePackBinary.GetMessagePackType(bytes, offset); + // if (headerType == MessagePackType.Nil) + // { + // readSize = 1; + // return null; + // } + // else if (headerType == MessagePackType.Array) + // { + // var arraySize = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + // offset += readSize; + + // // ReadValues + // parameters = new object[arraySize]; + // for (int i = 0; i < arraySize; i++) + // { + // var info = readMembers[i]; + // if (info != null) + // { + // parameters[i] = MessagePackSerializer.NonGeneric.Deserialize(info.Type, bytes, offset, formatterResolver, out readSize); + // offset += readSize; + // } + // else + // { + // offset += MessagePackBinary.ReadNextBlock(bytes, offset); + // } + // } + // } + // else if (headerType == MessagePackType.Map) + // { + // var mapSize = MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); + // offset += readSize; + + // // ReadValues + // parameters = new object[mapSize]; + // for (int i = 0; i < mapSize; i++) + // { + // var rawPropName = MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + // offset += readSize; + + // int index; + // if (mapMemberDictionary.TryGetValue(rawPropName.Array, rawPropName.Offset, rawPropName.Count, out index)) + // { + // var info = readMembers[index]; + // parameters[index] = MessagePackSerializer.NonGeneric.Deserialize(info.Type, bytes, offset, formatterResolver, out readSize); + // offset += readSize; + // } + // else + // { + // offset += MessagePackBinary.ReadNextBlock(bytes, offset); + // } + // } + // } + // else + // { + // throw new InvalidOperationException("Invalid MessagePackType:" + MessagePackCode.ToFormatName(bytes[offset])); + // } + + // // CreateObject + // object result = null; + // if (constructorParameterIndexes.Length == 0) + // { + // result = Activator.CreateInstance(metaInfo.Type); + // } + // else + // { + // var args = new object[constructorParameterIndexes.Length]; + // for (int i = 0; i < constructorParameterIndexes.Length; i++) + // { + // args[i] = parameters[constructorParameterIndexes[i]]; + // } + + // result = Activator.CreateInstance(metaInfo.Type, args); + // } + + // // SetMembers + // for (int i = 0; i < readMembers.Length; i++) + // { + // var info = readMembers[i]; + // if (info != null) + // { + // info.ReflectionStoreValue(result, parameters[i]); + // } + // } + + // readSize = offset - startOffset; + // return result; + // } + //} } #endif \ No newline at end of file diff --git a/src/MessagePack/Resolvers/DynamicEnumResolver.cs b/src/MessagePack/Resolvers/DynamicEnumResolver.cs index 8d605dd9d..67c54ea0b 100644 --- a/src/MessagePack/Resolvers/DynamicEnumResolver.cs +++ b/src/MessagePack/Resolvers/DynamicEnumResolver.cs @@ -1,4 +1,5 @@ #if !UNITY_WSA +#if !NET_STANDARD_2_0 using System; using MessagePack.Formatters; @@ -119,4 +120,5 @@ static TypeInfo BuildType(Type enumType) } } +#endif #endif \ No newline at end of file diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index af8d3938e..7ed6f724f 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -1,4 +1,5 @@ #if !UNITY_WSA +#if !NET_STANDARD_2_0 using System; using System.Linq; @@ -1802,29 +1803,29 @@ public void EmitStoreValue(ILGenerator il) } } - public object ReflectionLoadValue(object value) - { - if (IsProperty) - { - return PropertyInfo.GetValue(value); - } - else - { - return FieldInfo.GetValue(value); - } - } - - public void ReflectionStoreValue(object obj, object value) - { - if (IsProperty) - { - PropertyInfo.SetValue(obj, value); - } - else - { - FieldInfo.SetValue(obj, value); - } - } + //public object ReflectionLoadValue(object value) + //{ + // if (IsProperty) + // { + // return PropertyInfo.GetValue(value); + // } + // else + // { + // return FieldInfo.GetValue(value); + // } + //} + + //public void ReflectionStoreValue(object obj, object value) + //{ + // if (IsProperty) + // { + // PropertyInfo.SetValue(obj, value); + // } + // else + // { + // FieldInfo.SetValue(obj, value); + // } + //} } } @@ -1838,4 +1839,5 @@ public MessagePackDynamicObjectResolverException(string message) } } +#endif #endif \ No newline at end of file diff --git a/src/MessagePack/Resolvers/DynamicUnionResolver.cs b/src/MessagePack/Resolvers/DynamicUnionResolver.cs index a0c07e964..5834bf884 100644 --- a/src/MessagePack/Resolvers/DynamicUnionResolver.cs +++ b/src/MessagePack/Resolvers/DynamicUnionResolver.cs @@ -11,6 +11,7 @@ namespace MessagePack.Resolvers { #if !UNITY_WSA +#if !NET_STANDARD_2_0 /// /// UnionResolver by dynamic code generation. @@ -477,6 +478,7 @@ static MessagePackBinaryTypeInfo() } } +#endif #endif } @@ -512,4 +514,5 @@ public MessagePackDynamicUnionResolverException(string message) } } -} \ No newline at end of file +} + diff --git a/src/MessagePack/Resolvers/StandardResolver.cs b/src/MessagePack/Resolvers/StandardResolver.cs index 406d6df67..ea9d28e32 100644 --- a/src/MessagePack/Resolvers/StandardResolver.cs +++ b/src/MessagePack/Resolvers/StandardResolver.cs @@ -182,7 +182,7 @@ internal static class StandardResolverHelper MessagePack.Unity.UnityResolver.Instance, #endif -#if !ENABLE_IL2CPP && !UNITY_WSA +#if !ENABLE_IL2CPP && !UNITY_WSA && !NET_STANDARD_2_0 DynamicEnumResolver.Instance, // Try Enum DynamicGenericResolver.Instance, // Try Array, Tuple, Collection @@ -197,7 +197,7 @@ internal sealed class StandardResolverCore : IFormatterResolver static readonly IFormatterResolver[] resolvers = StandardResolverHelper.DefaultResolvers.Concat(new IFormatterResolver[] { -#if !ENABLE_IL2CPP && !UNITY_WSA +#if !ENABLE_IL2CPP && !UNITY_WSA && !NET_STANDARD_2_0 DynamicObjectResolver.Instance, // Try Object #endif }).ToArray(); @@ -236,7 +236,7 @@ internal sealed class ContractlessStandardResolverCore : IFormatterResolver static readonly IFormatterResolver[] resolvers = StandardResolverHelper.DefaultResolvers.Concat(new IFormatterResolver[] { -#if !ENABLE_IL2CPP && !UNITY_WSA +#if !ENABLE_IL2CPP && !UNITY_WSA && !NET_STANDARD_2_0 DynamicObjectResolver.Instance, // Try Object DynamicContractlessObjectResolver.Instance, // Serializes keys as strings #endif @@ -277,7 +277,7 @@ internal sealed class StandardResolverAllowPrivateCore : IFormatterResolver static readonly IFormatterResolver[] resolvers = StandardResolverHelper.DefaultResolvers.Concat(new IFormatterResolver[] { -#if !ENABLE_IL2CPP && !UNITY_WSA +#if !ENABLE_IL2CPP && !UNITY_WSA && !NET_STANDARD_2_0 DynamicObjectResolverAllowPrivate.Instance, // Try Object #endif }).ToArray(); @@ -316,7 +316,7 @@ internal sealed class ContractlessStandardResolverAllowPrivateCore : IFormatterR static readonly IFormatterResolver[] resolvers = StandardResolverHelper.DefaultResolvers.Concat(new IFormatterResolver[] { -#if !ENABLE_IL2CPP && !UNITY_WSA +#if !ENABLE_IL2CPP && !UNITY_WSA && !NET_STANDARD_2_0 DynamicObjectResolverAllowPrivate.Instance, // Try Object DynamicContractlessObjectResolverAllowPrivate.Instance, // Serializes keys as strings #endif From 0ad4ae0231f6cd01c3d6d9cdd51a26112523ef29 Mon Sep 17 00:00:00 2001 From: itn3000 Date: Thu, 20 Dec 2018 18:46:57 +0900 Subject: [PATCH 031/105] avoiding problem which empty proxy class is created in linux and mac(#355) It is because dotnet SDK's msbuild in linux and mac cannot resolve `net4x` targetframework. This fix changes to following behavior in generating project info. 1. execute `dotnet msbuild` with output msbuild's binary log 2. if failed, execute `msbuild` with output msbuild's binary log 3. if success with `dotnet msbuild` or `msbuild`, analyze binary log --- .../Utils/ProcessUtil.cs | 130 +++++++++++++++++ .../Utils/RoslynExtensions.cs | 131 ++++++++++++++---- 2 files changed, 236 insertions(+), 25 deletions(-) create mode 100644 src/MessagePack.UniversalCodeGenerator/Utils/ProcessUtil.cs diff --git a/src/MessagePack.UniversalCodeGenerator/Utils/ProcessUtil.cs b/src/MessagePack.UniversalCodeGenerator/Utils/ProcessUtil.cs new file mode 100644 index 000000000..d3b819cd4 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Utils/ProcessUtil.cs @@ -0,0 +1,130 @@ +using System.Diagnostics; +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace MessagePack.CodeGenerator +{ + internal static class ProcessUtil + { + public static async Task ExecuteProcessAsync(string fileName, string args, Stream stdout, Stream stderr, TextReader stdin, CancellationToken ct = default(CancellationToken)) + { + var psi = new ProcessStartInfo(fileName, args); + psi.UseShellExecute = false; + psi.CreateNoWindow = true; + psi.RedirectStandardError = stderr != null; + psi.RedirectStandardOutput = stdout != null; + psi.RedirectStandardInput = stdin != null; + using (var proc = new Process()) + using (var cts = new CancellationTokenSource()) + using (var exitedct = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ct)) + { + proc.StartInfo = psi; + proc.EnableRaisingEvents = true; + proc.Exited += (sender, ev) => + { + cts.Cancel(); + }; + if (!proc.Start()) + { + throw new InvalidOperationException($"failed to start process(fileName = {fileName}, args = {args})"); + } + int exitCode = 0; + await Task.WhenAll( + Task.Run(() => + { + exitCode = StdinTask(proc, stdin, exitedct, cts); + if(exitCode < 0) + { + proc.Dispose(); + } + }) + , + Task.Run(async () => + { + if (stdout != null) + { + await RedirectOutputTask(proc.StandardOutput.BaseStream, stdout, exitedct.Token, "stdout"); + } + }) + , + Task.Run(async () => + { + if (stderr != null) + { + await RedirectOutputTask(proc.StandardError.BaseStream, stderr, exitedct.Token, "stderr"); + } + }) + ); + if(exitCode >= 0) + { + return proc.ExitCode; + } + else + { + return -1; + } + } + } + static int StdinTask(Process proc, TextReader stdin, CancellationTokenSource exitedct, CancellationTokenSource cts) + { + if (stdin != null) + { + while (!exitedct.Token.IsCancellationRequested) + { + var l = stdin.ReadLine(); + if (l == null) + { + break; + } + proc.StandardInput.WriteLine(l); + } + proc.StandardInput.Dispose(); + } + exitedct.Token.WaitHandle.WaitOne(); + if (cts.IsCancellationRequested) + { + proc.WaitForExit(); + var exitCode = proc.ExitCode; + return exitCode; + } + else + { + proc.StandardOutput.Dispose(); + proc.StandardError.Dispose(); + proc.Kill(); + return -1; + } + } + + static async Task RedirectOutputTask(Stream procStdout, Stream stdout, CancellationToken ct, string suffix) + { + if (stdout != null) + { + var buf = new byte[1024]; + while (!ct.IsCancellationRequested) + { + try + { + var bytesread = await procStdout.ReadAsync(buf, 0, 1024, ct).ConfigureAwait(false); + if(bytesread <= 0) + { + break; + } + stdout.Write(buf, 0, bytesread); + } + catch(NullReferenceException) + { + break; + } + catch(ObjectDisposedException) + { + break; + } + } + } + } + + } +} \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs index 7dbc826f0..da80520c7 100644 --- a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs +++ b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs @@ -17,6 +17,103 @@ namespace MessagePack.CodeGenerator // Utility and Extension methods for Roslyn internal static class RoslynExtensions { + static (string fname, string args) GetBuildCommandLine(string csprojPath, string tempPath, bool useDotNet) + { + string fname = "dotnet"; + const string tasks = "ResolveAssemblyReferencesDesignTime;ResolveProjectReferencesDesignTime;ResolveComReferencesDesignTime;Compile"; + // from Buildalyzer implementation + // https://github.com/daveaglick/Buildalyzer/blob/b42d2e3ba1b3673a8133fb41e72b507b01bce1d6/src/Buildalyzer/Environment/BuildEnvironment.cs#L86-L96 + Dictionary properties = new Dictionary() + { + {"IntermediateOutputPath", tempPath}, + {"ProviderCommandLineArgs", "true"}, + {"GenerateResourceMSBuildArchitecture", "CurrentArchitecture"}, + {"DesignTimeBuild", "true"}, + {"BuildProjectReferences","false"}, + {"SkipCompilerExecution","true"}, + {"DisableRarCache", "true"}, + {"AutoGenerateBindingRedirects", "false"}, + {"CopyBuildOutputToOutputDirectory", "false"}, + {"CopyOutputSymbolsToOutputDirectory", "false"}, + {"SkipCopyBuildProduct", "true"}, + {"AddModules", "false"}, + {"UseCommonOutputDirectory", "true"}, + {"GeneratePackageOnBuild", "false"}, + {"RunPostBuildEvent", "false"}, + {"SolutionDir", new FileInfo(csprojPath).FullName} + }; + var propargs = string.Join(" ", properties.Select(kv => $"/p:{kv.Key}=\"{kv.Value}\"")); + // how to determine whether command should be executed('dotnet msbuild' or 'msbuild')? + if (useDotNet) + { + fname = "dotnet"; + return (fname, $"msbuild \"{csprojPath}\" /t:{tasks} {propargs} /bl:\"{Path.Combine(tempPath, "build.binlog")}\" /v:n"); + } + else + { + fname = "msbuild"; + return (fname, $"\"{csprojPath}\" /t:{tasks} {propargs} /bl:\"{Path.Combine(tempPath, "build.binlog")}\" /v:n"); + } + } + static async Task TryExecute(string csprojPath, string tempPath, bool useDotNet) + { + // executing build command with output binary log + var (fname, args) = GetBuildCommandLine(csprojPath, tempPath, useDotNet); + try + { + using (var stdout = new MemoryStream()) + using (var stderr = new MemoryStream()) + { + var exitCode = await ProcessUtil.ExecuteProcessAsync(fname, args, stdout, stderr, null).ConfigureAwait(false); + if (exitCode == 0) + { + return true; + } + else + { + // write process output to stdout and stderr when error. + using (var stdout2 = new MemoryStream(stdout.ToArray())) + using (var stderr2 = new MemoryStream(stderr.ToArray())) + using (var consoleStdout = Console.OpenStandardOutput()) + using (var consoleStderr = Console.OpenStandardError()) + { + await stdout2.CopyToAsync(consoleStdout).ConfigureAwait(false); + await stderr2.CopyToAsync(consoleStderr).ConfigureAwait(false); + } + return false; + } + } + } + catch (Exception e) + { + Console.WriteLine($"exception occured(fname={fname}, args={args}):{e}"); + return false; + } + } + static async Task GetAnalyzerResults(AnalyzerManager analyzerManager, string csprojPath, params string[] preprocessorSymbols) + { + var tempPath = Path.Combine(new FileInfo(csprojPath).Directory.FullName, "__buildtemp"); + try + { + if (!await TryExecute(csprojPath, tempPath, true).ConfigureAwait(false)) + { + Console.WriteLine("execute `dotnet msbuild` failed, retry with `msbuild`"); + if (!await TryExecute(csprojPath, tempPath, false).ConfigureAwait(false)) + { + throw new Exception("failed to build project"); + } + } + // get results of analysis from binarylog + return analyzerManager.Analyze(Path.Combine(tempPath, "build.binlog")).ToArray(); + } + finally + { + if (Directory.Exists(tempPath)) + { + Directory.Delete(tempPath, true); + } + } + } public static async Task GetCompilationFromProject(string csprojPath, params string[] preprocessorSymbols) { var analyzerOptions = new AnalyzerManagerOptions(); @@ -26,7 +123,7 @@ public static async Task GetCompilationFromProject(string csprojPat var projectAnalyzer = manager.GetProject(csprojPath); // addproj // projectAnalyzer.AddBuildLogger(new Microsoft.Build.Logging.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Minimal)); - var workspace = manager.GetWorkspaceWithPreventBuildEvent(); + var workspace = await manager.GetWorkspaceWithPreventBuildEventAsync().ConfigureAwait(false); workspace.WorkspaceFailed += WorkSpaceFailed; var project = workspace.CurrentSolution.Projects.First(); @@ -43,36 +140,20 @@ private static void WorkSpaceFailed(object sender, WorkspaceDiagnosticEventArgs Console.WriteLine(e); } - public static AdhocWorkspace GetWorkspaceWithPreventBuildEvent(this AnalyzerManager manager) + // WIP function for getting Roslyn's workspace from csproj + public static async Task GetWorkspaceWithPreventBuildEventAsync(this AnalyzerManager manager) { - // info article: https://qiita.com/skitoy4321/items/9edfb094549f5167a57f var projPath = manager.Projects.First().Value.ProjectFile.Path; - var tempPath = Path.Combine(new FileInfo(projPath).Directory.FullName, "__buildtemp") + System.IO.Path.DirectorySeparatorChar; - - var envopts = new EnvironmentOptions(); - // "Clean" and "Build" is listed in default - // Modify to designtime system https://github.com/dotnet/project-system/blob/master/docs/design-time-builds.md#targets-that-run-during-design-time-builds - // that prevent Pre/PostBuildEvent - - envopts.TargetsToBuild.Clear(); - // Clean should not use(if use pre/post build, dll was deleted). - // envopts.TargetsToBuild.Add("Clean"); - envopts.TargetsToBuild.Add("ResolveAssemblyReferencesDesignTime"); - envopts.TargetsToBuild.Add("ResolveProjectReferencesDesignTime"); - envopts.TargetsToBuild.Add("ResolveComReferencesDesignTime"); - envopts.TargetsToBuild.Add("Compile"); - envopts.GlobalProperties["IntermediateOutputPath"] = tempPath; - try + var ws = new AdhocWorkspace(); + foreach (var result in await GetAnalyzerResults(manager, projPath)) { - return GetWorkspace(manager, envopts); - } - finally - { - if (Directory.Exists(tempPath)) + // getting only successful build + if (result.Succeeded) { - Directory.Delete(tempPath, true); + result.AddToWorkspace(ws); } } + return ws; } public static AdhocWorkspace GetWorkspace(this AnalyzerManager manager, EnvironmentOptions envOptions) From 3765ddf7cf36b6964ece49fc39921ba118b18125 Mon Sep 17 00:00:00 2001 From: neuecc Date: Mon, 7 Jan 2019 20:49:44 +0900 Subject: [PATCH 032/105] Show Type.FullName when code generation failed. Return error code(1) instead of crash when code geneation failed. --- .../CodeAnalysis/TypeCollector.cs | 36 ++--- .../Program.cs | 148 +++++++++--------- 2 files changed, 96 insertions(+), 88 deletions(-) diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs index e51ebf70d..6dd4a42cc 100644 --- a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs @@ -327,7 +327,7 @@ void CollectUnion(INamedTypeSymbol type) var unionAttrs = type.GetAttributes().Where(x => x.AttributeClass == typeReferences.UnionAttribute).Select(x => x.ConstructorArguments).ToArray(); if (unionAttrs.Length == 0) { - throw new MessagePackGeneratorResolveFailedException("Serialization Type must mark UnionAttribute." + " type: " + type.Name); + throw new MessagePackGeneratorResolveFailedException("Serialization Type must mark UnionAttribute." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); } // 0, Int 1, SubType @@ -466,7 +466,7 @@ void CollectObject(INamedTypeSymbol type) var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribute); if (contractAttr == null) { - throw new MessagePackGeneratorResolveFailedException("Serialization Object must mark MessagePackObjectAttribute." + " type: " + type.Name); + throw new MessagePackGeneratorResolveFailedException("Serialization Object must mark MessagePackObjectAttribute." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); } var isIntKey = true; @@ -546,11 +546,11 @@ void CollectObject(INamedTypeSymbol type) if (!member.IsReadable && !member.IsWritable) continue; var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; - if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); + if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null; - if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name); + if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); if (searchFirst) { @@ -561,21 +561,21 @@ void CollectObject(INamedTypeSymbol type) { if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null)) { - throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name); + throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); } } if (isIntKey) { member.IntKey = (int)intKey; - if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); intMemebrs.Add(member.IntKey, member); } else { member.StringKey = (string)stringKey; - if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); member.IntKey = hiddenIntKey++; stringMembers.Add(member.StringKey, member); @@ -602,11 +602,11 @@ void CollectObject(INamedTypeSymbol type) if (!member.IsReadable && !member.IsWritable) continue; var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0]; - if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name); + if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null; var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null; - if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name); + if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); if (searchFirst) { @@ -624,14 +624,14 @@ void CollectObject(INamedTypeSymbol type) if (isIntKey) { member.IntKey = (int)intKey; - if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); intMemebrs.Add(member.IntKey, member); } else { member.StringKey = (string)stringKey; - if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name); + if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); member.IntKey = hiddenIntKey++; stringMembers.Add(member.StringKey, member); @@ -658,7 +658,7 @@ void CollectObject(INamedTypeSymbol type) } // struct allows null ctor - if (ctor == null && isClass) throw new MessagePackGeneratorResolveFailedException("can't find public constructor. type:" + type.Name); + if (ctor == null && isClass) throw new MessagePackGeneratorResolveFailedException("can't find public constructor. type:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); var constructorParameters = new List(); if (ctor != null) @@ -688,7 +688,7 @@ void CollectObject(INamedTypeSymbol type) } else { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterIndex:" + ctorParamIndex + " paramterType:" + item.Type.Name); + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " parameterIndex:" + ctorParamIndex + " paramterType:" + item.Type.Name); } } } @@ -701,7 +701,7 @@ void CollectObject(INamedTypeSymbol type) } else { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterIndex:" + ctorParamIndex); + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " parameterIndex:" + ctorParamIndex); } } } @@ -720,7 +720,7 @@ void CollectObject(INamedTypeSymbol type) } else { - throw new MessagePackGeneratorResolveFailedException("duplicate matched constructor parameter name:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); + throw new MessagePackGeneratorResolveFailedException("duplicate matched constructor parameter name:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); } } @@ -738,7 +738,7 @@ void CollectObject(INamedTypeSymbol type) } else { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " parameterName:" + item.Name + " paramterType:" + item.Type.Name); } } } @@ -751,7 +751,7 @@ void CollectObject(INamedTypeSymbol type) } else { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterName:" + item.Name); + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " parameterName:" + item.Name); } } } @@ -761,7 +761,7 @@ void CollectObject(INamedTypeSymbol type) if (ctor == null) { - throw new MessagePackGeneratorResolveFailedException("can't find matched constructor. type:" + type.Name); + throw new MessagePackGeneratorResolveFailedException("can't find matched constructor. type:" + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); } } diff --git a/src/MessagePack.UniversalCodeGenerator/Program.cs b/src/MessagePack.UniversalCodeGenerator/Program.cs index c53d9b91e..107447975 100644 --- a/src/MessagePack.UniversalCodeGenerator/Program.cs +++ b/src/MessagePack.UniversalCodeGenerator/Program.cs @@ -6,7 +6,6 @@ using System.IO; using System.Linq; using System.Text; -using System.Threading.Tasks; namespace MessagePack.CodeGenerator { @@ -56,7 +55,7 @@ public CommandlineArguments(string[] args) return; } - SHOW_HELP: + SHOW_HELP: Console.WriteLine("mpc arguments help:"); option.WriteOptionDescriptions(Console.Out); IsParsed = false; @@ -71,93 +70,102 @@ public string GetNamespaceDot() class Program { - static void Main(string[] args) + static int Main(string[] args) { - var cmdArgs = new CommandlineArguments(args); - if (!cmdArgs.IsParsed) + try { - return; - } + var cmdArgs = new CommandlineArguments(args); + if (!cmdArgs.IsParsed) + { + return 0; + } + + // Generator Start... - // Generator Start... + var sw = Stopwatch.StartNew(); + Console.WriteLine("Project Compilation Start:" + cmdArgs.InputPath); - var sw = Stopwatch.StartNew(); - Console.WriteLine("Project Compilation Start:" + cmdArgs.InputPath); + var collector = new TypeCollector(cmdArgs.InputPath, cmdArgs.ConditionalSymbols, true, cmdArgs.IsUseMap); - var collector = new TypeCollector(cmdArgs.InputPath, cmdArgs.ConditionalSymbols, true, cmdArgs.IsUseMap); + Console.WriteLine("Project Compilation Complete:" + sw.Elapsed.ToString()); + Console.WriteLine(); - Console.WriteLine("Project Compilation Complete:" + sw.Elapsed.ToString()); - Console.WriteLine(); + sw.Restart(); + Console.WriteLine("Method Collect Start"); - sw.Restart(); - Console.WriteLine("Method Collect Start"); + var (objectInfo, enumInfo, genericInfo, unionInfo) = collector.Collect(); - var (objectInfo, enumInfo, genericInfo, unionInfo) = collector.Collect(); + Console.WriteLine("Method Collect Complete:" + sw.Elapsed.ToString()); - Console.WriteLine("Method Collect Complete:" + sw.Elapsed.ToString()); + Console.WriteLine("Output Generation Start"); + sw.Restart(); - Console.WriteLine("Output Generation Start"); - sw.Restart(); + var objectFormatterTemplates = objectInfo + .GroupBy(x => x.Namespace) + .Select(x => new FormatterTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), + objectSerializationInfos = x.ToArray(), + }) + .ToArray(); - var objectFormatterTemplates = objectInfo - .GroupBy(x => x.Namespace) - .Select(x => new FormatterTemplate() + var enumFormatterTemplates = enumInfo + .GroupBy(x => x.Namespace) + .Select(x => new EnumTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), + enumSerializationInfos = x.ToArray() + }) + .ToArray(); + + var unionFormatterTemplates = unionInfo + .GroupBy(x => x.Namespace) + .Select(x => new UnionTemplate() + { + Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), + unionSerializationInfos = x.ToArray() + }) + .ToArray(); + + var resolverTemplate = new ResolverTemplate() { - Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), - objectSerializationInfos = x.ToArray(), - }) - .ToArray(); - - var enumFormatterTemplates = enumInfo - .GroupBy(x => x.Namespace) - .Select(x => new EnumTemplate() + Namespace = cmdArgs.GetNamespaceDot() + "Resolvers", + FormatterNamespace = cmdArgs.GetNamespaceDot() + "Formatters", + ResolverName = cmdArgs.ResolverName, + registerInfos = genericInfo.Cast().Concat(enumInfo).Concat(unionInfo).Concat(objectInfo).ToArray() + }; + + var sb = new StringBuilder(); + sb.AppendLine(resolverTemplate.TransformText()); + sb.AppendLine(); + foreach (var item in enumFormatterTemplates) + { + var text = item.TransformText(); + sb.AppendLine(text); + } + sb.AppendLine(); + foreach (var item in unionFormatterTemplates) { - Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), - enumSerializationInfos = x.ToArray() - }) - .ToArray(); - - var unionFormatterTemplates = unionInfo - .GroupBy(x => x.Namespace) - .Select(x => new UnionTemplate() + var text = item.TransformText(); + sb.AppendLine(text); + } + sb.AppendLine(); + foreach (var item in objectFormatterTemplates) { - Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key), - unionSerializationInfos = x.ToArray() - }) - .ToArray(); + var text = item.TransformText(); + sb.AppendLine(text); + } - var resolverTemplate = new ResolverTemplate() - { - Namespace = cmdArgs.GetNamespaceDot() + "Resolvers", - FormatterNamespace = cmdArgs.GetNamespaceDot() + "Formatters", - ResolverName = cmdArgs.ResolverName, - registerInfos = genericInfo.Cast().Concat(enumInfo).Concat(unionInfo).Concat(objectInfo).ToArray() - }; + Output(cmdArgs.OutputPath, sb.ToString()); - var sb = new StringBuilder(); - sb.AppendLine(resolverTemplate.TransformText()); - sb.AppendLine(); - foreach (var item in enumFormatterTemplates) - { - var text = item.TransformText(); - sb.AppendLine(text); + Console.WriteLine("String Generation Complete:" + sw.Elapsed.ToString()); + return 0; } - sb.AppendLine(); - foreach (var item in unionFormatterTemplates) + catch (Exception ex) { - var text = item.TransformText(); - sb.AppendLine(text); + Console.WriteLine("Unhandled Error:" + ex); + return 1; } - sb.AppendLine(); - foreach (var item in objectFormatterTemplates) - { - var text = item.TransformText(); - sb.AppendLine(text); - } - - Output(cmdArgs.OutputPath, sb.ToString()); - - Console.WriteLine("String Generation Complete:" + sw.Elapsed.ToString()); } static void Output(string path, string text) From 9559449a8e01b034fce99164329c514e330cc7f5 Mon Sep 17 00:00:00 2001 From: spacekey Date: Wed, 9 Jan 2019 22:35:29 +0900 Subject: [PATCH 033/105] Improve CanRead/CanWriteResult method. Add LZ4MessagePackInput/Output formatter. Add AspNetCoreMvcFormatter tests. --- MessagePack.sln | 15 + .../Formatter.cs | 95 ----- .../LZ4MessagePackInputFormatter.cs | 30 ++ .../LZ4MessagePackOutputFormatter.cs | 47 +++ .../MessagePackInputFormatter.cs | 30 ++ .../MessagePackOutputFormatter.cs | 47 +++ .../AspNetCoreMvcFormatterTest.cs | 360 ++++++++++++++++++ ...gePack.AspNetCoreMvcFormatter.Tests.csproj | 23 ++ 8 files changed, 552 insertions(+), 95 deletions(-) delete mode 100644 src/MessagePack.AspNetCoreMvcFormatter/Formatter.cs create mode 100644 src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackInputFormatter.cs create mode 100644 src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackOutputFormatter.cs create mode 100644 src/MessagePack.AspNetCoreMvcFormatter/MessagePackInputFormatter.cs create mode 100644 src/MessagePack.AspNetCoreMvcFormatter/MessagePackOutputFormatter.cs create mode 100644 tests/MessagePack.AspNetCoreMvcFormatter.Tests/AspNetCoreMvcFormatterTest.cs create mode 100644 tests/MessagePack.AspNetCoreMvcFormatter.Tests/MessagePack.AspNetCoreMvcFormatter.Tests.csproj diff --git a/MessagePack.sln b/MessagePack.sln index 416f1d3d5..d30804967 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -55,6 +55,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestData2", "sandbox\TestDa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.UniversalCodeGenerator", "src\MessagePack.UniversalCodeGenerator\MessagePack.UniversalCodeGenerator.csproj", "{10AD85DD-929D-49B8-BD43-45242C2644B7}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.AspNetCoreMvcFormatter.Tests", "tests\MessagePack.AspNetCoreMvcFormatter.Tests\MessagePack.AspNetCoreMvcFormatter.Tests.csproj", "{79C2B2CB-872A-4BA9-82DC-60F6DD77F940}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -245,6 +247,18 @@ Global {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.Build.0 = Release|Any CPU {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.ActiveCfg = Release|Any CPU {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.Build.0 = Release|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x64.ActiveCfg = Debug|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x64.Build.0 = Debug|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x86.ActiveCfg = Debug|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x86.Build.0 = Debug|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|Any CPU.Build.0 = Release|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x64.ActiveCfg = Release|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x64.Build.0 = Release|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x86.ActiveCfg = Release|Any CPU + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -265,6 +279,7 @@ Global {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {2A32A538-BA26-4D89-85D0-E4249AFA0837} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {10AD85DD-929D-49B8-BD43-45242C2644B7} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} + {79C2B2CB-872A-4BA9-82DC-60F6DD77F940} = {19FE674A-AC94-4E7E-B24C-2285D1D04CDE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {26F0752B-06F7-44AD-BFEE-8F2E36B3AA27} diff --git a/src/MessagePack.AspNetCoreMvcFormatter/Formatter.cs b/src/MessagePack.AspNetCoreMvcFormatter/Formatter.cs deleted file mode 100644 index 4bc2025ab..000000000 --- a/src/MessagePack.AspNetCoreMvcFormatter/Formatter.cs +++ /dev/null @@ -1,95 +0,0 @@ -using Microsoft.AspNetCore.Mvc.Formatters; -using System.Threading.Tasks; - -namespace MessagePack.AspNetCoreMvcFormatter -{ - public class MessagePackOutputFormatter : IOutputFormatter //, IApiResponseTypeMetadataProvider - { - const string ContentType = "application/x-msgpack"; - static readonly string[] SupportedContentTypes = new[] { ContentType }; - - readonly IFormatterResolver resolver; - - public MessagePackOutputFormatter() - : this(null) - { - - } - public MessagePackOutputFormatter(IFormatterResolver resolver) - { - this.resolver = resolver ?? MessagePackSerializer.DefaultResolver; - } - - //public IReadOnlyList GetSupportedContentTypes(string contentType, Type objectType) - //{ - // return SupportedContentTypes; - //} - - public bool CanWriteResult(OutputFormatterCanWriteContext context) - { - return true; - } - - public Task WriteAsync(OutputFormatterWriteContext context) - { - context.HttpContext.Response.ContentType = ContentType; - - // 'object' want to use anonymous type serialize, etc... - if (context.ObjectType == typeof(object)) - { - if (context.Object == null) - { - context.HttpContext.Response.Body.WriteByte(MessagePackCode.Nil); - return Task.CompletedTask; - } - else - { - // use concrete type. - MessagePackSerializer.NonGeneric.Serialize(context.Object.GetType(), context.HttpContext.Response.Body, context.Object, resolver); - return Task.CompletedTask; - } - } - else - { - MessagePackSerializer.NonGeneric.Serialize(context.ObjectType, context.HttpContext.Response.Body, context.Object, resolver); - return Task.CompletedTask; - } - } - } - - public class MessagePackInputFormatter : IInputFormatter // , IApiRequestFormatMetadataProvider - { - const string ContentType = "application/x-msgpack"; - static readonly string[] SupportedContentTypes = new[] { ContentType }; - - readonly IFormatterResolver resolver; - - public MessagePackInputFormatter() - : this(null) - { - - } - - public MessagePackInputFormatter(IFormatterResolver resolver) - { - this.resolver = resolver ?? MessagePackSerializer.DefaultResolver; - } - - //public IReadOnlyList GetSupportedContentTypes(string contentType, Type objectType) - //{ - // return SupportedContentTypes; - //} - - public bool CanRead(InputFormatterContext context) - { - return true; - } - - public Task ReadAsync(InputFormatterContext context) - { - var request = context.HttpContext.Request; - var result = MessagePackSerializer.NonGeneric.Deserialize(context.ModelType, request.Body, resolver); - return InputFormatterResult.SuccessAsync(result); - } - } -} \ No newline at end of file diff --git a/src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackInputFormatter.cs b/src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackInputFormatter.cs new file mode 100644 index 000000000..bed5a9172 --- /dev/null +++ b/src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackInputFormatter.cs @@ -0,0 +1,30 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Formatters; + +namespace MessagePack.AspNetCoreMvcFormatter +{ + public class LZ4MessagePackInputFormatter : IInputFormatter + { + private const string ContentType = "application/x-msgpack"; + private readonly IFormatterResolver resolver; + + public LZ4MessagePackInputFormatter() : this(null) + { + } + + public LZ4MessagePackInputFormatter(IFormatterResolver resolver) + { + this.resolver = resolver ?? MessagePackSerializer.DefaultResolver; + } + + public bool CanRead(InputFormatterContext context) => + context.HttpContext.Request.ContentType == ContentType; + + public Task ReadAsync(InputFormatterContext context) + { + var request = context.HttpContext.Request; + var result = LZ4MessagePackSerializer.NonGeneric.Deserialize(context.ModelType, request.Body, resolver); + return InputFormatterResult.SuccessAsync(result); + } + } +} diff --git a/src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackOutputFormatter.cs b/src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackOutputFormatter.cs new file mode 100644 index 000000000..cf852cb02 --- /dev/null +++ b/src/MessagePack.AspNetCoreMvcFormatter/LZ4MessagePackOutputFormatter.cs @@ -0,0 +1,47 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Formatters; + +namespace MessagePack.AspNetCoreMvcFormatter +{ + public class LZ4MessagePackOutputFormatter : IOutputFormatter + { + private const string ContentType = "application/x-msgpack"; + private readonly IFormatterResolver resolver; + + public LZ4MessagePackOutputFormatter() : this(null) + { + } + + public LZ4MessagePackOutputFormatter(IFormatterResolver resolver) + { + this.resolver = resolver ?? MessagePackSerializer.DefaultResolver; + } + + public bool CanWriteResult(OutputFormatterCanWriteContext context) => + context.HttpContext.Request.ContentType == ContentType; + + public Task WriteAsync(OutputFormatterWriteContext context) + { + context.HttpContext.Response.ContentType = ContentType; + + if (context.ObjectType == typeof(object)) + { + if (context.Object == null) + { + context.HttpContext.Response.Body.WriteByte(MessagePackCode.Nil); + return Task.CompletedTask; + } + else + { + LZ4MessagePackSerializer.NonGeneric.Serialize(context.Object.GetType(), context.HttpContext.Response.Body, context.Object, resolver); + return Task.CompletedTask; + } + } + else + { + LZ4MessagePackSerializer.NonGeneric.Serialize(context.ObjectType, context.HttpContext.Response.Body, context.Object, resolver); + return Task.CompletedTask; + } + } + } +} diff --git a/src/MessagePack.AspNetCoreMvcFormatter/MessagePackInputFormatter.cs b/src/MessagePack.AspNetCoreMvcFormatter/MessagePackInputFormatter.cs new file mode 100644 index 000000000..2a3ae8fa6 --- /dev/null +++ b/src/MessagePack.AspNetCoreMvcFormatter/MessagePackInputFormatter.cs @@ -0,0 +1,30 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Formatters; + +namespace MessagePack.AspNetCoreMvcFormatter +{ + public class MessagePackInputFormatter : IInputFormatter + { + private const string ContentType = "application/x-msgpack"; + private readonly IFormatterResolver resolver; + + public MessagePackInputFormatter() : this(null) + { + } + + public MessagePackInputFormatter(IFormatterResolver resolver) + { + this.resolver = resolver ?? MessagePackSerializer.DefaultResolver; + } + + public bool CanRead(InputFormatterContext context) => + context.HttpContext.Request.ContentType == ContentType; + + public Task ReadAsync(InputFormatterContext context) + { + var request = context.HttpContext.Request; + var result = MessagePackSerializer.NonGeneric.Deserialize(context.ModelType, request.Body, resolver); + return InputFormatterResult.SuccessAsync(result); + } + } +} diff --git a/src/MessagePack.AspNetCoreMvcFormatter/MessagePackOutputFormatter.cs b/src/MessagePack.AspNetCoreMvcFormatter/MessagePackOutputFormatter.cs new file mode 100644 index 000000000..b11b5595f --- /dev/null +++ b/src/MessagePack.AspNetCoreMvcFormatter/MessagePackOutputFormatter.cs @@ -0,0 +1,47 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Formatters; + +namespace MessagePack.AspNetCoreMvcFormatter +{ + public class MessagePackOutputFormatter : IOutputFormatter + { + private const string ContentType = "application/x-msgpack"; + private readonly IFormatterResolver resolver; + + public MessagePackOutputFormatter() : this(null) + { + } + + public MessagePackOutputFormatter(IFormatterResolver resolver) + { + this.resolver = resolver ?? MessagePackSerializer.DefaultResolver; + } + + public bool CanWriteResult(OutputFormatterCanWriteContext context) => + context.HttpContext.Request.ContentType == ContentType; + + public Task WriteAsync(OutputFormatterWriteContext context) + { + context.HttpContext.Response.ContentType = ContentType; + + if (context.ObjectType == typeof(object)) + { + if (context.Object == null) + { + context.HttpContext.Response.Body.WriteByte(MessagePackCode.Nil); + return Task.CompletedTask; + } + else + { + MessagePackSerializer.NonGeneric.Serialize(context.Object.GetType(), context.HttpContext.Response.Body, context.Object, resolver); + return Task.CompletedTask; + } + } + else + { + MessagePackSerializer.NonGeneric.Serialize(context.ObjectType, context.HttpContext.Response.Body, context.Object, resolver); + return Task.CompletedTask; + } + } + } +} diff --git a/tests/MessagePack.AspNetCoreMvcFormatter.Tests/AspNetCoreMvcFormatterTest.cs b/tests/MessagePack.AspNetCoreMvcFormatter.Tests/AspNetCoreMvcFormatterTest.cs new file mode 100644 index 000000000..d666959b1 --- /dev/null +++ b/tests/MessagePack.AspNetCoreMvcFormatter.Tests/AspNetCoreMvcFormatterTest.cs @@ -0,0 +1,360 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using MessagePack.AspNetCoreMvcFormatter; +using MessagePack.Resolvers; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Abstractions; +using Microsoft.AspNetCore.Mvc.Formatters; +using Microsoft.AspNetCore.Mvc.Infrastructure; +using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.WebUtilities; +using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; +using Moq; +using Newtonsoft.Json; +using Xunit; + +namespace MessagePack.Tests.ExtensionTests +{ + public class AspNetCoreMvcFormatterTest + { + private const string MsgPackContentType = "application/x-msgpack"; + + [Fact] + public async Task MessagePackFormatter() + { + var person = new User + { + UserId = 1, + FullName = "John Denver", + Age = 35, + Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + }; + + var messagePackBinary = MessagePackSerializer.Serialize(person); + + // OutputFormatter + var outputFormatterContext = GetOutputFormatterContext(person, typeof(User), MsgPackContentType); + var outputFormatter = new MessagePackOutputFormatter(StandardResolver.Instance); + + outputFormatter.CanWriteResult(outputFormatterContext).IsTrue(); + + await outputFormatter.WriteAsync(outputFormatterContext); + + var body = outputFormatterContext.HttpContext.Response.Body; + + Assert.NotNull(body); + body.Position = 0; + + using (var ms = new MemoryStream()) + { + body.CopyTo(ms); + Assert.Equal(messagePackBinary, ms.ToArray()); + } + + // InputFormatter + var httpContext = new DefaultHttpContext(); + httpContext.Features.Set(new TestResponseFeature()); + httpContext.Request.Body = new NonSeekableReadStream(messagePackBinary); + httpContext.Request.ContentType = MsgPackContentType; + + var inputFormatterContext = CreateInputFormatterContext(typeof(User), httpContext); + + var inputFormatter = new MessagePackInputFormatter(); + + inputFormatter.CanRead(inputFormatterContext).IsTrue(); + + var result = await inputFormatter.ReadAsync(inputFormatterContext); + + Assert.False(result.HasError); + + var userModel = Assert.IsType(result.Model); + userModel.IsStructuralEqual(person); + } + + [Fact] + public void MessagePackFormatterCanNotRead() + { + var person = new User(); + + // OutputFormatter + var outputFormatterContext = GetOutputFormatterContext(person, typeof(User), "application/json"); + var outputFormatter = new MessagePackOutputFormatter(StandardResolver.Instance); + + outputFormatter.CanWriteResult(outputFormatterContext).IsFalse(); + + // InputFormatter + var httpContext = new DefaultHttpContext(); + httpContext.Features.Set(new TestResponseFeature()); + httpContext.Request.Body = new NonSeekableReadStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(person))); + httpContext.Request.ContentType = "application/json"; + + var inputFormatterContext = CreateInputFormatterContext(typeof(User), httpContext); + + var inputFormatter = new MessagePackInputFormatter(); + + inputFormatter.CanRead(inputFormatterContext).IsFalse(); + } + + [Fact] + public async Task LZ4MessagePackFormatter() + { + var person = new User + { + UserId = 1, + FullName = "John Denver", + Age = 35, + Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + }; + + var messagePackBinary = MessagePackSerializer.Serialize(person); + var lz4MessagePackBinary = LZ4MessagePackSerializer.Serialize(person); + + // OutputFormatter + var outputFormatterContext = GetOutputFormatterContext(person, typeof(User), MsgPackContentType); + var outputFormatter = new LZ4MessagePackOutputFormatter(StandardResolver.Instance); + await outputFormatter.WriteAsync(outputFormatterContext); + var body = outputFormatterContext.HttpContext.Response.Body; + + Assert.NotNull(body); + body.Position = 0; + + using (var ms = new MemoryStream()) + { + body.CopyTo(ms); + var binary = ms.ToArray(); + + binary.IsNot(messagePackBinary); + binary.Is(lz4MessagePackBinary); + } + + // InputFormatter + var httpContext = new DefaultHttpContext(); + httpContext.Features.Set(new TestResponseFeature()); + httpContext.Request.Body = new NonSeekableReadStream(messagePackBinary); + httpContext.Request.ContentType = MsgPackContentType; + + var inputFormatterContext = CreateInputFormatterContext(typeof(User), httpContext); + + var inputFormatter = new LZ4MessagePackInputFormatter(); + + var result = await inputFormatter.ReadAsync(inputFormatterContext); + + Assert.False(result.HasError); + + var userModel = Assert.IsType(result.Model); + userModel.IsStructuralEqual(person); + } + + [Fact] + public void LZ4MessagePackFormatterCanNotRead() + { + var person = new User(); + + // OutputFormatter + var outputFormatterContext = GetOutputFormatterContext(person, typeof(User), "application/json"); + var outputFormatter = new LZ4MessagePackOutputFormatter(StandardResolver.Instance); + + outputFormatter.CanWriteResult(outputFormatterContext).IsFalse(); + + // InputFormatter + var httpContext = new DefaultHttpContext(); + httpContext.Features.Set(new TestResponseFeature()); + httpContext.Request.Body = new NonSeekableReadStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(person))); + httpContext.Request.ContentType = "application/json"; + + var inputFormatterContext = CreateInputFormatterContext(typeof(User), httpContext); + + var inputFormatter = new LZ4MessagePackInputFormatter(); + + inputFormatter.CanRead(inputFormatterContext).IsFalse(); + } + + /// + /// JsonOutputFormatterTests.cs#L453 + /// + private static OutputFormatterWriteContext GetOutputFormatterContext( + object outputValue, + Type outputType, + string contentType = "application/xml; charset=utf-8", + MemoryStream responseStream = null) + { + var mediaTypeHeaderValue = MediaTypeHeaderValue.Parse(contentType); + + var actionContext = GetActionContext(mediaTypeHeaderValue, responseStream); + return new OutputFormatterWriteContext( + actionContext.HttpContext, + new TestHttpResponseStreamWriterFactory().CreateWriter, + outputType, + outputValue) + { + ContentType = new StringSegment(contentType), + }; + } + + /// + /// JsonOutputFormatterTests.cs#L472 + /// + private static ActionContext GetActionContext( + MediaTypeHeaderValue contentType, + MemoryStream responseStream = null) + { + var request = new Mock(); + var headers = new HeaderDictionary(); + request.Setup(r => r.ContentType).Returns(contentType.ToString()); + request.SetupGet(r => r.Headers).Returns(headers); + headers[HeaderNames.AcceptCharset] = contentType.Charset.ToString(); + var response = new Mock(); + response.SetupGet(f => f.Body).Returns(responseStream ?? new MemoryStream()); + var httpContext = new Mock(); + httpContext.SetupGet(c => c.Request).Returns(request.Object); + httpContext.SetupGet(c => c.Response).Returns(response.Object); + return new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor()); + } + + /// + /// JsonInputFormatterTest.cs#L717 + /// + private InputFormatterContext CreateInputFormatterContext( + Type modelType, + HttpContext httpContext, + string modelName = null, + bool treatEmptyInputAsDefaultValue = false) + { + var provider = new EmptyModelMetadataProvider(); + var metadata = provider.GetMetadataForType(modelType); + + return new InputFormatterContext( + httpContext, + modelName: modelName ?? string.Empty, + modelState: new ModelStateDictionary(), + metadata: metadata, + readerFactory: new TestHttpRequestStreamReaderFactory().CreateReader, + treatEmptyInputAsDefaultValue: treatEmptyInputAsDefaultValue); + } + + /// + /// JsonInputFormatterTest.cs#L791 + /// + private class TestResponseFeature : HttpResponseFeature + { + public override void OnCompleted(Func callback, object state) + { + // do not do anything + } + } + + /// + /// TestHttpResponseStreamWriterFactory.cs + /// + private class TestHttpResponseStreamWriterFactory : IHttpResponseStreamWriterFactory + { + private const int DefaultBufferSize = 16 * 1024; + + public TextWriter CreateWriter(Stream stream, Encoding encoding) + { + return new HttpResponseStreamWriter(stream, encoding, DefaultBufferSize); + } + } + + /// + /// TestHttpRequestStreamReaderFactory.cs + /// + private class TestHttpRequestStreamReaderFactory : IHttpRequestStreamReaderFactory + { + public TextReader CreateReader(Stream stream, Encoding encoding) + { + return new HttpRequestStreamReader(stream, encoding); + } + } + + /// + /// NonSeekableReadableStream.cs + /// + private class NonSeekableReadStream : Stream + { + private Stream _inner; + + public NonSeekableReadStream(byte[] data) + : this(new MemoryStream(data)) + { + } + + public NonSeekableReadStream(Stream inner) + { + _inner = inner; + } + + public override bool CanRead => _inner.CanRead; + + public override bool CanSeek => false; + + public override bool CanWrite => false; + + public override long Length + { + get { throw new NotSupportedException(); } + } + + public override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override void Flush() + { + throw new NotImplementedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + count = Math.Max(count, 1); + return _inner.Read(buffer, offset, count); + } + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + count = Math.Max(count, 1); + return _inner.ReadAsync(buffer, offset, count, cancellationToken); + } + } + } + + [MessagePackObject] + public class User + { + [Key(0)] + public int UserId { get; set; } + + [Key(1)] + public string FullName { get; set; } + + [Key(2)] + public int Age { get; set; } + + [Key(3)] + public string Description { get; set; } + } +} diff --git a/tests/MessagePack.AspNetCoreMvcFormatter.Tests/MessagePack.AspNetCoreMvcFormatter.Tests.csproj b/tests/MessagePack.AspNetCoreMvcFormatter.Tests/MessagePack.AspNetCoreMvcFormatter.Tests.csproj new file mode 100644 index 000000000..c016630b8 --- /dev/null +++ b/tests/MessagePack.AspNetCoreMvcFormatter.Tests/MessagePack.AspNetCoreMvcFormatter.Tests.csproj @@ -0,0 +1,23 @@ + + + + netcoreapp2.1 + + false + + + + + + + + + + + + + + + + + From 615ff0ed6af9903bcd917ffb3be859aaa6192cf6 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 14 Jan 2019 22:04:58 -0800 Subject: [PATCH 034/105] Fix class name typo: SimlpeStringKeyData fixup! 550c3c1e57b --- sandbox/DynamicCodeDumper/Program.cs | 8 +- sandbox/Sandbox/Generated.cs | 204 +++++++++--------- sandbox/Sandbox/Program.cs | 6 +- sandbox/SharedData/Class1.cs | 4 +- .../Scripts/Tests/ObjectResolverTest.cs | 4 +- .../DynamicObjectFallbackTest.cs | 2 +- .../MessagePackBinaryStream.cs | 10 +- tests/MessagePack.Tests/ObjectResolverTest.cs | 2 +- 8 files changed, 120 insertions(+), 120 deletions(-) diff --git a/sandbox/DynamicCodeDumper/Program.cs b/sandbox/DynamicCodeDumper/Program.cs index 4c8d82067..c75f36ffb 100644 --- a/sandbox/DynamicCodeDumper/Program.cs +++ b/sandbox/DynamicCodeDumper/Program.cs @@ -20,7 +20,7 @@ static void Main(string[] args) try { // var mi = AutomataKeyGen.GetGetKeyMethod(); - // mi.Invoke(null, new[] { + // mi.Invoke(null, new[] { //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); @@ -33,8 +33,8 @@ static void Main(string[] args) //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); - //DynamicObjectResolver.Instance.GetFormatter(); - //DynamicObjectResolver.Instance.GetFormatter(); + //DynamicObjectResolver.Instance.GetFormatter(); + //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); var f = DynamicObjectResolverAllowPrivate.Instance.GetFormatter(); @@ -206,7 +206,7 @@ public class EmptyContractless } [MessagePackObject(true)] - public class SimlpeStringKeyData2 + public class SimpleStringKeyData2 { public int MyProperty1 { get; set; } public int MyProperty2 { get; set; } diff --git a/sandbox/Sandbox/Generated.cs b/sandbox/Sandbox/Generated.cs index b587bf8c2..fbfcaf5e2 100644 --- a/sandbox/Sandbox/Generated.cs +++ b/sandbox/Sandbox/Generated.cs @@ -62,7 +62,7 @@ static GeneratedResolverGetFormatterHelper() {typeof(global::SharedData.IUnionSample), 14 }, {typeof(global::IMessageBody), 15 }, {typeof(global::SharedData.FirstSimpleData), 16 }, - {typeof(global::SharedData.SimlpeStringKeyData), 17 }, + {typeof(global::SharedData.SimpleStringKeyData), 17 }, {typeof(global::SharedData.SimpleStructIntKeyData), 18 }, {typeof(global::SharedData.SimpleStructStringKeyData), 19 }, {typeof(global::SharedData.SimpleIntKeyData), 20 }, @@ -136,7 +136,7 @@ internal static object GetFormatter(Type t) case 14: return new MessagePack.Formatters.SharedData.IUnionSampleFormatter(); case 15: return new MessagePack.Formatters.IMessageBodyFormatter(); case 16: return new MessagePack.Formatters.SharedData.FirstSimpleDataFormatter(); - case 17: return new MessagePack.Formatters.SharedData.SimlpeStringKeyDataFormatter(); + case 17: return new MessagePack.Formatters.SharedData.SimpleStringKeyDataFormatter(); case 18: return new MessagePack.Formatters.SharedData.SimpleStructIntKeyDataFormatter(); case 19: return new MessagePack.Formatters.SharedData.SimpleStructStringKeyDataFormatter(); case 20: return new MessagePack.Formatters.SharedData.SimpleIntKeyDataFormatter(); @@ -210,7 +210,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.ByteEnum v { return MessagePackBinary.WriteByte(ref bytes, offset, (Byte)value); } - + public global::SharedData.ByteEnum Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { return (global::SharedData.ByteEnum)MessagePackBinary.ReadByte(bytes, offset, out readSize); @@ -240,7 +240,7 @@ public int Serialize(ref byte[] bytes, int offset, global::GlobalMyEnum value, g { return MessagePackBinary.WriteInt32(ref bytes, offset, (Int32)value); } - + public global::GlobalMyEnum Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { return (global::GlobalMyEnum)MessagePackBinary.ReadInt32(bytes, offset, out readSize); @@ -320,7 +320,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IUnionChecker Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -330,7 +330,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker"); @@ -368,9 +368,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -429,7 +429,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IUnionChecker2 Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -439,7 +439,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker2"); @@ -477,9 +477,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -523,7 +523,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IIVersioningUnion Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -533,7 +533,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IIVersioningUnion"); @@ -559,9 +559,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -610,7 +610,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.RootUnionType Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -620,7 +620,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.RootUnionType"); @@ -650,9 +650,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -701,7 +701,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IUnionSample Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -711,7 +711,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionSample"); @@ -741,9 +741,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -815,7 +815,7 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::IMessageBody Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -825,7 +825,7 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::IMessageBody"); @@ -859,9 +859,9 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -894,7 +894,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FirstSimpl { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Prop1); @@ -952,13 +952,13 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FirstSimpl } - public sealed class SimlpeStringKeyDataFormatter : global::MessagePack.Formatters.IMessagePackFormatter + public sealed class SimpleStringKeyDataFormatter : global::MessagePack.Formatters.IMessagePackFormatter { readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping; readonly byte[][] ____stringByteKeys; - public SimlpeStringKeyDataFormatter() + public SimpleStringKeyDataFormatter() { this.____keyMapping = new global::MessagePack.Internal.AutomataDictionary() { @@ -972,18 +972,18 @@ public SimlpeStringKeyDataFormatter() global::System.Text.Encoding.UTF8.GetBytes("Prop1"), global::System.Text.Encoding.UTF8.GetBytes("Prop2"), global::System.Text.Encoding.UTF8.GetBytes("Prop3"), - + }; } - public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimlpeStringKeyData value, global::MessagePack.IFormatterResolver formatterResolver) + public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStringKeyData value, global::MessagePack.IFormatterResolver formatterResolver) { if (value == null) { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 3); offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); @@ -995,7 +995,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimlpeStri return offset - startOffset; } - public global::SharedData.SimlpeStringKeyData Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) + public global::SharedData.SimpleStringKeyData Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (global::MessagePack.MessagePackBinary.IsNil(bytes, offset)) { @@ -1037,14 +1037,14 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimlpeStri readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } readSize = offset - startOffset; - var ____result = new global::SharedData.SimlpeStringKeyData(); + var ____result = new global::SharedData.SimpleStringKeyData(); ____result.Prop1 = __Prop1__; ____result.Prop2 = __Prop2__; ____result.Prop3 = __Prop3__; @@ -1058,7 +1058,7 @@ public sealed class SimpleStructIntKeyDataFormatter : global::MessagePack.Format public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStructIntKeyData value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.X); @@ -1133,14 +1133,14 @@ public SimpleStructStringKeyDataFormatter() { global::System.Text.Encoding.UTF8.GetBytes("key-X"), global::System.Text.Encoding.UTF8.GetBytes("key-Y"), - + }; } public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStructStringKeyData value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 2); offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); @@ -1187,7 +1187,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStru readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -1211,13 +1211,13 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleIntK { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 7); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Prop1); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop2, formatterResolver); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop3, formatterResolver); - offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop4, formatterResolver); + offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop4, formatterResolver); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop5, formatterResolver); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop6, formatterResolver); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.BytesSpecial, formatterResolver); @@ -1239,7 +1239,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleIntK var __Prop1__ = default(int); var __Prop2__ = default(global::SharedData.ByteEnum); var __Prop3__ = default(string); - var __Prop4__ = default(global::SharedData.SimlpeStringKeyData); + var __Prop4__ = default(global::SharedData.SimpleStringKeyData); var __Prop5__ = default(global::SharedData.SimpleStructIntKeyData); var __Prop6__ = default(global::SharedData.SimpleStructStringKeyData); var __BytesSpecial__ = default(byte[]); @@ -1260,7 +1260,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleIntK __Prop3__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); break; case 3: - __Prop4__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + __Prop4__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); break; case 4: __Prop5__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); @@ -1298,7 +1298,7 @@ public sealed class Vector2Formatter : global::MessagePack.Formatters.IMessagePa public int Serialize(ref byte[] bytes, int offset, global::SharedData.Vector2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.X); @@ -1356,7 +1356,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.EmptyClass { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -1401,7 +1401,7 @@ public sealed class EmptyStructFormatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.EmptyStruct value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -1449,7 +1449,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version1 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 6); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -1519,7 +1519,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version2 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 8); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -1596,7 +1596,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version0 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 4); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -1654,7 +1654,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV1 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty1, formatterResolver); @@ -1715,7 +1715,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV2 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty1, formatterResolver); @@ -1776,7 +1776,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV0 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty1, formatterResolver); @@ -1837,7 +1837,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback1 { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + value.OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); @@ -1894,7 +1894,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback1_ { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); @@ -1958,14 +1958,14 @@ public Callback2Formatter() this.____stringByteKeys = new byte[][] { global::System.Text.Encoding.UTF8.GetBytes("X"), - + }; } public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + value.OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 1); @@ -2007,7 +2007,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2 readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2038,14 +2038,14 @@ public Callback2_2Formatter() this.____stringByteKeys = new byte[][] { global::System.Text.Encoding.UTF8.GetBytes("X"), - + }; } public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2_2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 1); @@ -2087,7 +2087,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2_ readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2111,7 +2111,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SubUnionTy { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2172,7 +2172,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SubUnionTy { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2233,7 +2233,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 4); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2287,7 +2287,7 @@ public sealed class MySubUnion2Formatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 6); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2346,7 +2346,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2399,7 +2399,7 @@ public sealed class MySubUnion4Formatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion4 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 8); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2460,7 +2460,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Versioning { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 8); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2522,7 +2522,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MyClass va { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty1); @@ -2589,7 +2589,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.VersionBlo { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2656,7 +2656,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.UnVersionB { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2718,7 +2718,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty1 val { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -2772,7 +2772,7 @@ public Empty2Formatter() this.____stringByteKeys = new byte[][] { - + }; } @@ -2783,7 +2783,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty2 val { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -2819,7 +2819,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty2 val readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2841,7 +2841,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty1 { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2903,7 +2903,7 @@ public NonEmpty2Formatter() this.____stringByteKeys = new byte[][] { global::System.Text.Encoding.UTF8.GetBytes("MyProperty"), - + }; } @@ -2914,7 +2914,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty2 { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 1); offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); @@ -2956,7 +2956,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty2 readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2975,7 +2975,7 @@ public sealed class VectorLike2Formatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.VectorLike2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.x); @@ -3031,7 +3031,7 @@ public sealed class Vector3LikeFormatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.Vector3Like value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.x); @@ -3097,7 +3097,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.ArrayOptim { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref bytes, offset, 16); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty0); @@ -3242,7 +3242,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NestParent { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -3297,7 +3297,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FooClass v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.XYZ); @@ -3352,7 +3352,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.BarClass v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.OPQ, formatterResolver); @@ -3423,7 +3423,7 @@ public int Serialize(ref byte[] bytes, int offset, global::Abcdefg.Efcdigjl.Atea { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -3494,7 +3494,7 @@ public int Serialize(ref byte[] bytes, int offset, global::GlobalMan value, glob { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -3549,7 +3549,7 @@ public int Serialize(ref byte[] bytes, int offset, global::Message value, global { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 4); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.UserId); @@ -3622,7 +3622,7 @@ public int Serialize(ref byte[] bytes, int offset, global::TextMessageBody value { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Text, formatterResolver); @@ -3677,7 +3677,7 @@ public int Serialize(ref byte[] bytes, int offset, global::StampMessageBody valu { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.StampId); @@ -3732,7 +3732,7 @@ public int Serialize(ref byte[] bytes, int offset, global::QuestMessageBody valu { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.QuestId); @@ -3793,7 +3793,7 @@ public int Serialize(ref byte[] bytes, int offset, global::ArrayTestTest value, { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 7); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty0, formatterResolver); @@ -3901,7 +3901,7 @@ public SimpleModelFormatter() global::System.Text.Encoding.UTF8.GetBytes("Precision"), global::System.Text.Encoding.UTF8.GetBytes("Money"), global::System.Text.Encoding.UTF8.GetBytes("Amount"), - + }; } @@ -3912,7 +3912,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SimpleModel value, gl { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 6); offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); @@ -3984,7 +3984,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SimpleModel value, gl readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -4028,7 +4028,7 @@ public ComplexModelFormatter() global::System.Text.Encoding.UTF8.GetBytes("Name"), global::System.Text.Encoding.UTF8.GetBytes("UpdatedOn"), global::System.Text.Encoding.UTF8.GetBytes("SimpleModels"), - + }; } @@ -4039,7 +4039,7 @@ public int Serialize(ref byte[] bytes, int offset, global::ComplexModel value, g { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 6); offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); @@ -4111,7 +4111,7 @@ public int Serialize(ref byte[] bytes, int offset, global::ComplexModel value, g readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -4176,7 +4176,7 @@ public StringKeySerializerTargetFormatter() global::System.Text.Encoding.UTF8.GetBytes("MyProperty7"), global::System.Text.Encoding.UTF8.GetBytes("MyProperty8"), global::System.Text.Encoding.UTF8.GetBytes("MyProperty9"), - + }; } @@ -4187,7 +4187,7 @@ public int Serialize(ref byte[] bytes, int offset, global::PerfBenchmarkDotNet.S { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 9); offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); @@ -4277,7 +4277,7 @@ public int Serialize(ref byte[] bytes, int offset, global::PerfBenchmarkDotNet.S readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } diff --git a/sandbox/Sandbox/Program.cs b/sandbox/Sandbox/Program.cs index 8559d0006..1ab556f04 100644 --- a/sandbox/Sandbox/Program.cs +++ b/sandbox/Sandbox/Program.cs @@ -323,7 +323,7 @@ public class SimpleIntKeyData [Key(2)] public string Prop3 { get; set; } [Key(3)] - public SimlpeStringKeyData Prop4 { get; set; } + public SimpleStringKeyData Prop4 { get; set; } [Key(4)] public SimpleStructIntKeyData Prop5 { get; set; } [Key(5)] @@ -347,7 +347,7 @@ static void Main(string[] args) Prop1 = 100, Prop2 = ByteEnum.C, Prop3 = "abcde", - Prop4 = new SimlpeStringKeyData + Prop4 = new SimpleStringKeyData { Prop1 = 99999, Prop2 = ByteEnum.E, @@ -826,4 +826,4 @@ public IHogeMoge Deserialize(byte[] bytes, int offset, IFormatterResolver format } } -} \ No newline at end of file +} diff --git a/sandbox/SharedData/Class1.cs b/sandbox/SharedData/Class1.cs index 0f280c7c7..fe367b609 100644 --- a/sandbox/SharedData/Class1.cs +++ b/sandbox/SharedData/Class1.cs @@ -36,7 +36,7 @@ public class SimpleIntKeyData [Key(2)] public string Prop3 { get; set; } [Key(3)] - public SimlpeStringKeyData Prop4 { get; set; } + public SimpleStringKeyData Prop4 { get; set; } [Key(4)] public SimpleStructIntKeyData Prop5 { get; set; } [Key(5)] @@ -81,7 +81,7 @@ public int Serialize(ref byte[] bytes, int offset, int value, IFormatterResolver } [MessagePackObject(true)] - public class SimlpeStringKeyData + public class SimpleStringKeyData { public int Prop1 { get; set; } public ByteEnum Prop2 { get; set; } diff --git a/src/MessagePack.UnityClient/Assets/Scripts/Tests/ObjectResolverTest.cs b/src/MessagePack.UnityClient/Assets/Scripts/Tests/ObjectResolverTest.cs index d36b28aea..42ac1c973 100644 --- a/src/MessagePack.UnityClient/Assets/Scripts/Tests/ObjectResolverTest.cs +++ b/src/MessagePack.UnityClient/Assets/Scripts/Tests/ObjectResolverTest.cs @@ -23,7 +23,7 @@ public void Standard() Prop1 = 100, Prop2 = ByteEnum.C, Prop3 = "abcde", - Prop4 = new SimlpeStringKeyData + Prop4 = new SimpleStringKeyData { Prop1 = 99999, Prop2 = ByteEnum.E, @@ -254,4 +254,4 @@ public void GenericStructTest() v.MyProperty1.Is("aaa"); } } -} \ No newline at end of file +} diff --git a/tests/MessagePack.Tests/DynamicObjectFallbackTest.cs b/tests/MessagePack.Tests/DynamicObjectFallbackTest.cs index 027a82df1..d312dbfb1 100644 --- a/tests/MessagePack.Tests/DynamicObjectFallbackTest.cs +++ b/tests/MessagePack.Tests/DynamicObjectFallbackTest.cs @@ -34,7 +34,7 @@ public void DynamicObject() new DynamicObjectFallbackTestContainer { MyProperty = 300, - MoreObject = new SharedData.SimlpeStringKeyData + MoreObject = new SharedData.SimpleStringKeyData { Prop1 = 10, Prop2 = SharedData.ByteEnum.C, diff --git a/tests/MessagePack.Tests/MessagePackBinaryStream.cs b/tests/MessagePack.Tests/MessagePackBinaryStream.cs index 1cab31e6f..96b2c25dd 100644 --- a/tests/MessagePack.Tests/MessagePackBinaryStream.cs +++ b/tests/MessagePack.Tests/MessagePackBinaryStream.cs @@ -262,7 +262,7 @@ public void Standard() Prop1 = 100, Prop2 = ByteEnum.C, Prop3 = "abcde", - Prop4 = new SimlpeStringKeyData + Prop4 = new SimpleStringKeyData { Prop1 = 99999, Prop2 = ByteEnum.E, @@ -320,7 +320,7 @@ public void Standard() public void ReadStrictDeserialize() { var ms = new MemoryStream(); - MessagePackSerializer.Serialize(ms, new SimlpeStringKeyData + MessagePackSerializer.Serialize(ms, new SimpleStringKeyData { Prop1 = 99999, Prop2 = ByteEnum.E, @@ -334,7 +334,7 @@ public void ReadStrictDeserialize() ms.Position = 0; - var d = MessagePackSerializer.Deserialize(ms, readStrict: true); + var d = MessagePackSerializer.Deserialize(ms, readStrict: true); d.Prop1.Is(99999); d.Prop2.Is(ByteEnum.E); d.Prop3.Is(3); var d2 = (SimpleStructStringKeyData)MessagePackSerializer.NonGeneric.Deserialize(typeof(SimpleStructStringKeyData), ms, readStrict: true); @@ -345,7 +345,7 @@ public void ReadStrictDeserialize() public void ReadStrictDeserializeLZ4() { var ms = new MemoryStream(); - LZ4MessagePackSerializer.Serialize(ms, new SimlpeStringKeyData + LZ4MessagePackSerializer.Serialize(ms, new SimpleStringKeyData { Prop1 = 99999, Prop2 = ByteEnum.E, @@ -360,7 +360,7 @@ public void ReadStrictDeserializeLZ4() ms.Position = 0; - var d = LZ4MessagePackSerializer.Deserialize(ms, readStrict: true); + var d = LZ4MessagePackSerializer.Deserialize(ms, readStrict: true); d.Prop1.Is(99999); d.Prop2.Is(ByteEnum.E); d.Prop3.Is(3); var ds = LZ4MessagePackSerializer.Deserialize(ms, readStrict: true); diff --git a/tests/MessagePack.Tests/ObjectResolverTest.cs b/tests/MessagePack.Tests/ObjectResolverTest.cs index 7849f0329..f720736cf 100644 --- a/tests/MessagePack.Tests/ObjectResolverTest.cs +++ b/tests/MessagePack.Tests/ObjectResolverTest.cs @@ -25,7 +25,7 @@ public void Standard() Prop1 = 100, Prop2 = ByteEnum.C, Prop3 = "abcde", - Prop4 = new SimlpeStringKeyData + Prop4 = new SimpleStringKeyData { Prop1 = 99999, Prop2 = ByteEnum.E, From 73c956ec73e205e2278e67ca93ee6be11b2635a1 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 17 Jan 2019 22:29:21 -0800 Subject: [PATCH 035/105] Add comment to help folks find the SDK to install --- global.json | 1 + 1 file changed, 1 insertion(+) diff --git a/global.json b/global.json index b62f6cc57..bba910871 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,6 @@ { "sdk": { + // Get the pinned version of the SDK from https://dotnet.microsoft.com/download/dotnet-core/2.1 "version": "2.1.500" } } From d8fe665a6a591873c44fb379b76c72ea8ad101a0 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 17 Jan 2019 23:32:52 -0800 Subject: [PATCH 036/105] Add missing || NETFRAMEWORK to .tt file --- src/MessagePack/Internal/UnsafeMemory.tt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MessagePack/Internal/UnsafeMemory.tt b/src/MessagePack/Internal/UnsafeMemory.tt index dbf7797f4..cc5037998 100644 --- a/src/MessagePack/Internal/UnsafeMemory.tt +++ b/src/MessagePack/Internal/UnsafeMemory.tt @@ -7,7 +7,7 @@ <# var Max = 31; #> -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System.Runtime.CompilerServices; @@ -64,4 +64,4 @@ namespace MessagePack.Internal } } -#endif \ No newline at end of file +#endif From 0d71f847173caefcbd2dc0b973ace47443a19478 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 19 Jan 2019 15:34:31 -0800 Subject: [PATCH 037/105] Restored missing .tt files These files were deleted in 527dadf029. This brings them into the new UniversalCodeGenerator project. --- .../Generator/EnumTemplate.cs | 36 ++-- .../Generator/EnumTemplate.tt | 37 ++++ .../Generator/FormatterTemplate.cs | 152 ++++++++--------- .../Generator/FormatterTemplate.tt | 158 ++++++++++++++++++ .../Generator/ResolverTemplate.cs | 46 ++--- .../Generator/ResolverTemplate.tt | 78 +++++++++ .../Generator/UnionTemplate.cs | 76 ++++----- .../Generator/UnionTemplate.tt | 115 +++++++++++++ .../MessagePack.UniversalCodeGenerator.csproj | 48 +++++- .../Properties/launchSettings.json | 9 + 10 files changed, 599 insertions(+), 156 deletions(-) create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.tt create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.tt create mode 100644 src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt create mode 100644 src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs index ba322bdb4..e38ce538e 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs +++ b/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.cs @@ -1,10 +1,10 @@ // ------------------------------------------------------------------------------ // -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 +// This code was generated by a tool. +// Runtime Version: 16.0.0.0 // -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // // ------------------------------------------------------------------------------ namespace MessagePack.CodeGenerator.Generator @@ -18,8 +18,8 @@ namespace MessagePack.CodeGenerator.Generator /// Class to produce the template output /// - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + #line 1 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public partial class EnumTemplate : EnumTemplateBase { #line hidden @@ -31,35 +31,35 @@ public virtual string TransformText() this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 11 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); #line default #line hidden this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n"); - #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 16 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" foreach(var info in enumSerializationInfos) { #line default #line hidden this.Write(" public sealed class "); - #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 17 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); #line default #line hidden this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); - #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 17 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden this.Write(">\r\n {\r\n public int Serialize(ref byte[] bytes, int offset, "); - #line 19 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 19 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default @@ -67,21 +67,21 @@ public virtual string TransformText() this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n " + " return MessagePackBinary.Write"); - #line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 21 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); #line default #line hidden this.Write("(ref bytes, offset, ("); - #line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 21 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); #line default #line hidden this.Write(")value);\r\n }\r\n \r\n public "); - #line 24 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 24 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default @@ -89,21 +89,21 @@ public virtual string TransformText() this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" + "matterResolver, out int readSize)\r\n {\r\n return ("); - #line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 26 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden this.Write(")MessagePackBinary.Read"); - #line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 26 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType)); #line default #line hidden this.Write("(bytes, offset, out readSize);\r\n }\r\n }\r\n\r\n"); - #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt" + #line 30 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\EnumTemplate.tt" } #line default @@ -120,7 +120,7 @@ public virtual string TransformText() /// /// Base class for this transformation /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public class EnumTemplateBase { #region Fields diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.tt b/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.tt new file mode 100644 index 000000000..846ee8d0c --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/EnumTemplate.tt @@ -0,0 +1,37 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +#pragma warning disable 618 +#pragma warning disable 612 +#pragma warning disable 414 +#pragma warning disable 168 + +namespace <#= Namespace #> +{ + using System; + using MessagePack; + +<# foreach(var info in enumSerializationInfos) { #> + public sealed class <#= info.Name #>Formatter : global::MessagePack.Formatters.IMessagePackFormatter<<#= info.FullName #>> + { + public int Serialize(ref byte[] bytes, int offset, <#= info.FullName #> value, global::MessagePack.IFormatterResolver formatterResolver) + { + return MessagePackBinary.Write<#= info.UnderlyingType #>(ref bytes, offset, (<#= info.UnderlyingType #>)value); + } + + public <#= info.FullName #> Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) + { + return (<#= info.FullName #>)MessagePackBinary.Read<#= info.UnderlyingType #>(bytes, offset, out readSize); + } + } + +<# } #> + +} + +#pragma warning restore 168 +#pragma warning restore 414 +#pragma warning restore 618 +#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs index 1d9f52c69..0b9424e04 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs +++ b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs @@ -1,10 +1,10 @@ // ------------------------------------------------------------------------------ // -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 +// This code was generated by a tool. +// Runtime Version: 16.0.0.0 // -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // // ------------------------------------------------------------------------------ namespace MessagePack.CodeGenerator.Generator @@ -18,8 +18,8 @@ namespace MessagePack.CodeGenerator.Generator /// Class to produce the template output /// - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + #line 1 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public partial class FormatterTemplate : FormatterTemplateBase { #line hidden @@ -31,35 +31,35 @@ public virtual string TransformText() this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 11 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); #line default #line hidden this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n"); - #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 16 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var objInfo in objectSerializationInfos) { #line default #line hidden this.Write("\r\n public sealed class "); - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 18 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name)); #line default #line hidden this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 18 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); #line default #line hidden this.Write(">\r\n {\r\n"); - #line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 20 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if( objInfo.IsStringKey) { #line default @@ -67,7 +67,7 @@ public virtual string TransformText() this.Write("\r\n readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping" + ";\r\n readonly byte[][] ____stringByteKeys;\r\n\r\n public "); - #line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 25 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name)); #line default @@ -75,28 +75,28 @@ public virtual string TransformText() this.Write("Formatter()\r\n {\r\n this.____keyMapping = new global::MessagePack" + ".Internal.AutomataDictionary()\r\n {\r\n"); - #line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 29 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members) { #line default #line hidden this.Write(" { \""); - #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 30 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey)); #line default #line hidden this.Write("\", "); - #line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 30 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); #line default #line hidden this.Write("},\r\n"); - #line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 31 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default @@ -104,42 +104,42 @@ public virtual string TransformText() this.Write(" };\r\n\r\n this.____stringByteKeys = new byte[][]\r\n " + " {\r\n"); - #line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 36 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members.Where(x => x.IsReadable)) { #line default #line hidden this.Write(" global::MessagePack.MessagePackBinary.GetEncodedStringBytes(\""); - #line 37 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 37 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey)); #line default #line hidden this.Write("\"),\r\n"); - #line 38 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 38 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write(" \r\n };\r\n }\r\n\r\n"); - #line 42 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 42 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write("\r\n public int Serialize(ref byte[] bytes, int offset, "); - #line 44 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 44 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); #line default #line hidden this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n"); - #line 46 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 46 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if( objInfo.IsClass) { #line default @@ -147,14 +147,14 @@ public virtual string TransformText() this.Write(" if (value == null)\r\n {\r\n return global::Mes" + "sagePack.MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n"); - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 51 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write(" \r\n"); - #line 52 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 52 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore) { #line default @@ -162,21 +162,21 @@ public virtual string TransformText() this.Write(" ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(" + ");\r\n"); - #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 54 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #line default #line hidden this.Write(" value.OnBeforeSerialize();\r\n"); - #line 56 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 56 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write(" var startOffset = offset;\r\n"); - #line 58 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 58 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if( objInfo.IsIntKey) { if( (objInfo.MaxKey + 1) <= 15) { #line default @@ -184,14 +184,14 @@ public virtual string TransformText() this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeader" + "Unsafe(ref bytes, offset, "); - #line 59 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 59 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1)); #line default #line hidden this.Write(");\r\n"); - #line 60 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 60 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default @@ -199,14 +199,14 @@ public virtual string TransformText() this.Write(" offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref " + "bytes, offset, "); - #line 61 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 61 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1)); #line default #line hidden this.Write(");\r\n"); - #line 62 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 62 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } } else if( objInfo.WriteCount <= 15) { #line default @@ -214,14 +214,14 @@ public virtual string TransformText() this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUn" + "safe(ref bytes, offset, "); - #line 63 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 63 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount)); #line default #line hidden this.Write(");\r\n"); - #line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 64 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default @@ -229,32 +229,32 @@ public virtual string TransformText() this.Write(" offset += global::MessagePack.MessagePackBinary.WriteMapHeader(ref by" + "tes, offset, "); - #line 65 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 65 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount)); #line default #line hidden this.Write(");\r\n"); - #line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 66 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 67 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsIntKey) { #line default #line hidden - #line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 68 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" for(var i =0; i<= objInfo.MaxKey; i++) { var member = objInfo.GetMember(i); #line default #line hidden - #line 69 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 69 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if( member == null) { #line default @@ -262,27 +262,27 @@ public virtual string TransformText() this.Write(" offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, o" + "ffset);\r\n"); - #line 71 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 71 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default #line hidden this.Write(" offset += "); - #line 72 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 72 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString())); #line default #line hidden this.Write(";\r\n"); - #line 73 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 73 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } } } else { #line default #line hidden - #line 74 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 74 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" var index = 0; foreach(var x in objInfo.Members) { #line default @@ -290,28 +290,28 @@ public virtual string TransformText() this.Write(" offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, o" + "ffset, this.____stringByteKeys["); - #line 75 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 75 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(index++)); #line default #line hidden this.Write("]);\r\n offset += "); - #line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 76 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.GetSerializeMethodString())); #line default #line hidden this.Write(";\r\n"); - #line 77 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 77 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } } #line default #line hidden this.Write(" return offset - startOffset;\r\n }\r\n\r\n public "); - #line 81 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 81 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName)); #line default @@ -320,14 +320,14 @@ public virtual string TransformText() "matterResolver, out int readSize)\r\n {\r\n if (global::MessagePac" + "k.MessagePackBinary.IsNil(bytes, offset))\r\n {\r\n"); - #line 85 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 85 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if( objInfo.IsClass) { #line default #line hidden this.Write(" readSize = 1;\r\n return null;\r\n"); - #line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 88 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default @@ -335,14 +335,14 @@ public virtual string TransformText() this.Write(" throw new InvalidOperationException(\"typecode is null, struct not" + " supported\");\r\n"); - #line 90 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 90 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write(" }\r\n\r\n var startOffset = offset;\r\n"); - #line 94 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 94 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsStringKey) { #line default @@ -350,7 +350,7 @@ public virtual string TransformText() this.Write(" var length = global::MessagePack.MessagePackBinary.ReadMapHeader(byte" + "s, offset, out readSize);\r\n"); - #line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 96 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default @@ -358,42 +358,42 @@ public virtual string TransformText() this.Write(" var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(by" + "tes, offset, out readSize);\r\n"); - #line 98 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 98 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write(" offset += readSize;\r\n\r\n"); - #line 101 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 101 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members) { #line default #line hidden this.Write(" var __"); - #line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 102 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write("__ = default("); - #line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 102 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Type)); #line default #line hidden this.Write(");\r\n"); - #line 103 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 103 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write("\r\n for (int i = 0; i < length; i++)\r\n {\r\n"); - #line 107 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 107 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsStringKey) { #line default @@ -408,49 +408,49 @@ public virtual string TransformText() } "); - #line 116 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 116 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default #line hidden this.Write(" var key = i;\r\n"); - #line 118 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 118 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write("\r\n switch (key)\r\n {\r\n"); - #line 122 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 122 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members) { #line default #line hidden this.Write(" case "); - #line 123 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 123 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); #line default #line hidden this.Write(":\r\n __"); - #line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 124 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write("__ = "); - #line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 124 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.GetDeserializeMethodString())); #line default #line hidden this.Write(";\r\n break;\r\n"); - #line 126 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 126 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default @@ -459,14 +459,14 @@ public virtual string TransformText() "ack.MessagePackBinary.ReadNextBlock(bytes, offset);\r\n bre" + "ak;\r\n }\r\n"); - #line 131 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 131 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsStringKey) { #line default #line hidden this.Write(" \r\n NEXT_LOOP:\r\n"); - #line 133 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 133 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default @@ -474,41 +474,41 @@ public virtual string TransformText() this.Write(" offset += readSize;\r\n }\r\n\r\n readSize = offs" + "et - startOffset;\r\n\r\n var ____result = new "); - #line 139 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 139 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString())); #line default #line hidden this.Write(";\r\n"); - #line 140 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 140 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { #line default #line hidden this.Write(" ____result."); - #line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 141 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write(" = __"); - #line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 141 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write("__;\r\n"); - #line 142 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 142 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - #line 143 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 143 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { #line default @@ -516,21 +516,21 @@ public virtual string TransformText() this.Write(" ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeseri" + "alize();\r\n"); - #line 145 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 145 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #line default #line hidden this.Write(" ____result.OnAfterDeserialize();\r\n"); - #line 147 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 147 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden this.Write(" return ____result;\r\n }\r\n }\r\n\r\n"); - #line 152 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt" + #line 152 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default @@ -547,7 +547,7 @@ public virtual string TransformText() /// /// Base class for this transformation /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public class FormatterTemplateBase { #region Fields diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt new file mode 100644 index 000000000..e05e432f4 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt @@ -0,0 +1,158 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +#pragma warning disable 618 +#pragma warning disable 612 +#pragma warning disable 414 +#pragma warning disable 168 + +namespace <#= Namespace #> +{ + using System; + using MessagePack; + +<# foreach(var objInfo in objectSerializationInfos) { #> + + public sealed class <#= objInfo.Name #>Formatter : global::MessagePack.Formatters.IMessagePackFormatter<<#= objInfo.FullName #>> + { +<# if( objInfo.IsStringKey) { #> + + readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping; + readonly byte[][] ____stringByteKeys; + + public <#= objInfo.Name #>Formatter() + { + this.____keyMapping = new global::MessagePack.Internal.AutomataDictionary() + { +<# foreach(var x in objInfo.Members) { #> + { "<#= x.StringKey #>", <#= x.IntKey #>}, +<# } #> + }; + + this.____stringByteKeys = new byte[][] + { +<# foreach(var x in objInfo.Members.Where(x => x.IsReadable)) { #> + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("<#= x.StringKey #>"), +<# } #> + }; + } + +<# } #> + + public int Serialize(ref byte[] bytes, int offset, <#= objInfo.FullName #> value, global::MessagePack.IFormatterResolver formatterResolver) + { +<# if( objInfo.IsClass) { #> + if (value == null) + { + return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); + } +<# } #> +<#if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore) { #> + ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(); +<# } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #> + value.OnBeforeSerialize(); +<# } #> + var startOffset = offset; +<# if( objInfo.IsIntKey) { if( (objInfo.MaxKey + 1) <= 15) { #> + offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, <#= objInfo.MaxKey + 1 #>); +<# } else { #> + offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref bytes, offset, <#= objInfo.MaxKey + 1 #>); +<# } } else if( objInfo.WriteCount <= 15) { #> + offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, <#= objInfo.WriteCount #>); +<# } else { #> + offset += global::MessagePack.MessagePackBinary.WriteMapHeader(ref bytes, offset, <#= objInfo.WriteCount #>); +<# } #> +<# if(objInfo.IsIntKey) { #> +<# for(var i =0; i<= objInfo.MaxKey; i++) { var member = objInfo.GetMember(i); #> +<# if( member == null) { #> + offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); +<# } else { #> + offset += <#= member.GetSerializeMethodString() #>; +<# } } } else { #> +<# var index = 0; foreach(var x in objInfo.Members) { #> + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[<#= index++ #>]); + offset += <#= x.GetSerializeMethodString() #>; +<# } } #> + return offset - startOffset; + } + + public <#= objInfo.FullName #> Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) + { + if (global::MessagePack.MessagePackBinary.IsNil(bytes, offset)) + { +<# if( objInfo.IsClass) { #> + readSize = 1; + return null; +<# } else { #> + throw new InvalidOperationException("typecode is null, struct not supported"); +<# } #> + } + + var startOffset = offset; +<# if(objInfo.IsStringKey) { #> + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); +<# } else { #> + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); +<# } #> + offset += readSize; + +<# foreach(var x in objInfo.Members) { #> + var __<#= x.Name #>__ = default(<#= x.Type #>); +<# } #> + + for (int i = 0; i < length; i++) + { +<# if(objInfo.IsStringKey) { #> + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + goto NEXT_LOOP; + } +<# } else { #> + var key = i; +<# } #> + + switch (key) + { +<# foreach(var x in objInfo.Members) { #> + case <#= x.IntKey #>: + __<#= x.Name #>__ = <#= x.GetDeserializeMethodString() #>; + break; +<# } #> + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } +<# if(objInfo.IsStringKey) { #> + NEXT_LOOP: +<# } #> + offset += readSize; + } + + readSize = offset - startOffset; + + var ____result = new <#= objInfo.GetConstructorString() #>; +<# foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { #> + ____result.<#= x.Name #> = __<#= x.Name #>__; +<# } #> +<#if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { #> + ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); +<# } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #> + ____result.OnAfterDeserialize(); +<# } #> + return ____result; + } + } + +<# } #> +} + +#pragma warning restore 168 +#pragma warning restore 414 +#pragma warning restore 618 +#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs index 0e7d5d821..706677e0a 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs +++ b/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.cs @@ -1,10 +1,10 @@ // ------------------------------------------------------------------------------ // -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 +// This code was generated by a tool. +// Runtime Version: 16.0.0.0 // -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // // ------------------------------------------------------------------------------ namespace MessagePack.CodeGenerator.Generator @@ -18,8 +18,8 @@ namespace MessagePack.CodeGenerator.Generator /// Class to produce the template output /// - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + #line 1 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public partial class ResolverTemplate : ResolverTemplateBase { #line hidden @@ -31,14 +31,14 @@ public virtual string TransformText() this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 11 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); #line default #line hidden this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n public class "); - #line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 16 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); #line default @@ -46,14 +46,14 @@ public virtual string TransformText() this.Write(" : global::MessagePack.IFormatterResolver\r\n {\r\n public static readonly " + "global::MessagePack.IFormatterResolver Instance = new "); - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 18 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); #line default #line hidden this.Write("();\r\n\r\n "); - #line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 20 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); #line default @@ -76,7 +76,7 @@ static FormatterCache() { var f = "); - #line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 36 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); #line default @@ -92,7 +92,7 @@ static FormatterCache() internal static class "); - #line 45 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 45 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); #line default @@ -100,7 +100,7 @@ internal static class "); this.Write("GetFormatterHelper\r\n {\r\n static readonly global::System.Collections.Gen" + "eric.Dictionary lookup;\r\n\r\n static "); - #line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 49 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName)); #line default @@ -108,35 +108,35 @@ internal static class "); this.Write("GetFormatterHelper()\r\n {\r\n lookup = new global::System.Collecti" + "ons.Generic.Dictionary("); - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 51 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(registerInfos.Length)); #line default #line hidden this.Write(")\r\n {\r\n"); - #line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 53 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; #line default #line hidden this.Write(" {typeof("); - #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 54 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.FullName)); #line default #line hidden this.Write("), "); - #line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 54 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden this.Write(" },\r\n"); - #line 55 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 55 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" } #line default @@ -145,28 +145,28 @@ internal static class "); "\n {\r\n int key;\r\n if (!lookup.TryGetValue(t, out key" + ")) return null;\r\n\r\n switch (key)\r\n {\r\n"); - #line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 66 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; #line default #line hidden this.Write(" case "); - #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 67 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden this.Write(": return new "); - #line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 67 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.FormatterName.StartsWith("global::") ? x.FormatterName: (!string.IsNullOrEmpty(FormatterNamespace) ? FormatterNamespace + "." : FormatterNamespace) + x.FormatterName)); #line default #line hidden this.Write("();\r\n"); - #line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt" + #line 68 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\ResolverTemplate.tt" } #line default @@ -184,7 +184,7 @@ internal static class "); /// /// Base class for this transformation /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public class ResolverTemplateBase { #region Fields diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.tt b/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.tt new file mode 100644 index 000000000..a7511a363 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/ResolverTemplate.tt @@ -0,0 +1,78 @@ +<#@ template language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +#pragma warning disable 618 +#pragma warning disable 612 +#pragma warning disable 414 +#pragma warning disable 168 + +namespace <#= Namespace #> +{ + using System; + using MessagePack; + + public class <#= ResolverName #> : global::MessagePack.IFormatterResolver + { + public static readonly global::MessagePack.IFormatterResolver Instance = new <#= ResolverName #>(); + + <#= ResolverName #>() + { + + } + + public global::MessagePack.Formatters.IMessagePackFormatter GetFormatter() + { + return FormatterCache.formatter; + } + + static class FormatterCache + { + public static readonly global::MessagePack.Formatters.IMessagePackFormatter formatter; + + static FormatterCache() + { + var f = <#= ResolverName #>GetFormatterHelper.GetFormatter(typeof(T)); + if (f != null) + { + formatter = (global::MessagePack.Formatters.IMessagePackFormatter)f; + } + } + } + } + + internal static class <#= ResolverName #>GetFormatterHelper + { + static readonly global::System.Collections.Generic.Dictionary lookup; + + static <#= ResolverName #>GetFormatterHelper() + { + lookup = new global::System.Collections.Generic.Dictionary(<#= registerInfos.Length #>) + { +<# for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; #> + {typeof(<#= x.FullName #>), <#= i #> }, +<# } #> + }; + } + + internal static object GetFormatter(Type t) + { + int key; + if (!lookup.TryGetValue(t, out key)) return null; + + switch (key) + { +<# for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i]; #> + case <#= i #>: return new <#= x.FormatterName.StartsWith("global::") ? x.FormatterName: (!string.IsNullOrEmpty(FormatterNamespace) ? FormatterNamespace + "." : FormatterNamespace) + x.FormatterName#>(); +<# } #> + default: return null; + } + } + } +} + +#pragma warning restore 168 +#pragma warning restore 414 +#pragma warning restore 618 +#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs index 9b29e9012..5ec89b29d 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs +++ b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs @@ -1,10 +1,10 @@ // ------------------------------------------------------------------------------ // -// このコードはツールによって生成されました。 -// ランタイム バージョン: 15.0.0.0 +// This code was generated by a tool. +// Runtime Version: 16.0.0.0 // -// このファイルへの変更は、正しくない動作の原因になる可能性があり、 -// コードが再生成されると失われます。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // // ------------------------------------------------------------------------------ namespace MessagePack.CodeGenerator.Generator @@ -18,8 +18,8 @@ namespace MessagePack.CodeGenerator.Generator /// Class to produce the template output /// - #line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + #line 1 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public partial class UnionTemplate : UnionTemplateBase { #line hidden @@ -31,7 +31,7 @@ public virtual string TransformText() this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" + " 414\r\n#pragma warning disable 168\r\n\r\nnamespace "); - #line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 11 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Namespace)); #line default @@ -39,21 +39,21 @@ public virtual string TransformText() this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using MessageP" + "ack;\r\n\r\n"); - #line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 17 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" foreach(var info in unionSerializationInfos) { #line default #line hidden this.Write(" public sealed class "); - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 18 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); #line default #line hidden this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<"); - #line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 18 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default @@ -62,7 +62,7 @@ public virtual string TransformText() "typeToKeyAndJumpMap;\r\n readonly Dictionary keyToJumpMap;\r\n\r\n " + " public "); - #line 23 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 23 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); #line default @@ -70,7 +70,7 @@ public virtual string TransformText() this.Write("Formatter()\r\n {\r\n this.typeToKeyAndJumpMap = new Dictionary>("); - #line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 25 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length)); #line default @@ -78,70 +78,70 @@ public virtual string TransformText() this.Write(", global::MessagePack.Internal.RuntimeTypeHandleEqualityComparer.Default)\r\n " + " {\r\n"); - #line 27 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 27 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #line default #line hidden this.Write(" { typeof("); - #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 28 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); #line default #line hidden this.Write(").TypeHandle, new KeyValuePair("); - #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 28 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Key)); #line default #line hidden this.Write(", "); - #line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 28 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden this.Write(") },\r\n"); - #line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 29 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default #line hidden this.Write(" };\r\n this.keyToJumpMap = new Dictionary("); - #line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 31 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length)); #line default #line hidden this.Write(")\r\n {\r\n"); - #line 33 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 33 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #line default #line hidden this.Write(" { "); - #line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 34 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Key)); #line default #line hidden this.Write(", "); - #line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 34 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden this.Write(" },\r\n"); - #line 35 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 35 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default @@ -149,7 +149,7 @@ public virtual string TransformText() this.Write(" };\r\n }\r\n\r\n public int Serialize(ref byte[] bytes, int o" + "ffset, "); - #line 39 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 39 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default @@ -166,35 +166,35 @@ public virtual string TransformText() { "); - #line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 49 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #line default #line hidden this.Write(" case "); - #line 50 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 50 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden this.Write(":\r\n offset += formatterResolver.GetFormatterWithVerify<"); - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 51 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); #line default #line hidden this.Write(">().Serialize(ref bytes, offset, ("); - #line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 51 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); #line default #line hidden this.Write(")value, formatterResolver);\r\n break;\r\n"); - #line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 53 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default @@ -204,7 +204,7 @@ public virtual string TransformText() "urn MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n \r\n " + " public "); - #line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 64 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default @@ -223,7 +223,7 @@ public virtual string TransformText() { throw new InvalidOperationException(""Invalid Union data was detected. Type:"); - #line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 76 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default @@ -242,35 +242,35 @@ public virtual string TransformText() "); - #line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 88 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden this.Write(" result = null;\r\n switch (key)\r\n {\r\n"); - #line 91 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 91 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #line default #line hidden this.Write(" case "); - #line 92 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 92 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden this.Write(":\r\n result = ("); - #line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 93 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden this.Write(")formatterResolver.GetFormatterWithVerify<"); - #line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 93 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); #line default @@ -278,7 +278,7 @@ public virtual string TransformText() this.Write(">().Deserialize(bytes, offset, formatterResolver, out readSize);\r\n " + " offset += readSize;\r\n break;\r\n"); - #line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 96 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default @@ -296,7 +296,7 @@ public virtual string TransformText() "); - #line 108 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt" + #line 108 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default @@ -313,7 +313,7 @@ public virtual string TransformText() /// /// Base class for this transformation /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "16.0.0.0")] public class UnionTemplateBase { #region Fields diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt new file mode 100644 index 000000000..e1578f896 --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt @@ -0,0 +1,115 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +#pragma warning disable 618 +#pragma warning disable 612 +#pragma warning disable 414 +#pragma warning disable 168 + +namespace <#= Namespace #> +{ + using System; + using System.Collections.Generic; + using MessagePack; + +<# foreach(var info in unionSerializationInfos) { #> + public sealed class <#= info.Name #>Formatter : global::MessagePack.Formatters.IMessagePackFormatter<<#= info.FullName #>> + { + readonly Dictionary> typeToKeyAndJumpMap; + readonly Dictionary keyToJumpMap; + + public <#= info.Name #>Formatter() + { + this.typeToKeyAndJumpMap = new Dictionary>(<#= info.SubTypes.Length #>, global::MessagePack.Internal.RuntimeTypeHandleEqualityComparer.Default) + { +<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> + { typeof(<#= item.Type #>).TypeHandle, new KeyValuePair(<#= item.Key #>, <#= i #>) }, +<# } #> + }; + this.keyToJumpMap = new Dictionary(<#= info.SubTypes.Length #>) + { +<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> + { <#= item.Key #>, <#= i #> }, +<# } #> + }; + } + + public int Serialize(ref byte[] bytes, int offset, <#= info.FullName #> value, global::MessagePack.IFormatterResolver formatterResolver) + { + KeyValuePair keyValuePair; + if (value != null && this.typeToKeyAndJumpMap.TryGetValue(value.GetType().TypeHandle, out keyValuePair)) + { + var startOffset = offset; + offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); + offset += MessagePackBinary.WriteInt32(ref bytes, offset, keyValuePair.Key); + switch (keyValuePair.Value) + { +<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> + case <#= i #>: + offset += formatterResolver.GetFormatterWithVerify<<#= item.Type #>>().Serialize(ref bytes, offset, (<#= item.Type #>)value, formatterResolver); + break; +<# } #> + default: + break; + } + + return offset - startOffset; + } + + return MessagePackBinary.WriteNil(ref bytes, offset); + } + + public <#= info.FullName #> Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) + { + if (MessagePackBinary.IsNil(bytes, offset)) + { + readSize = 1; + return null; + } + + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:<#= info.FullName #>"); + } + offset += readSize; + + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; + + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } + + <#= info.FullName #> result = null; + switch (key) + { +<# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> + case <#= i #>: + result = (<#= info.FullName #>)formatterResolver.GetFormatterWithVerify<<#= item.Type #>>().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; +<# } #> + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + + readSize = offset - startOffset; + + return result; + } + } + +<# } #> + +} + +#pragma warning restore 168 +#pragma warning restore 414 +#pragma warning restore 618 +#pragma warning restore 612 \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj index 53db88fc3..265177d30 100644 --- a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj @@ -1,4 +1,4 @@ - + Exe @@ -11,4 +11,50 @@ + + + True + True + EnumTemplate.tt + + + True + True + FormatterTemplate.tt + + + True + True + ResolverTemplate.tt + + + True + True + UnionTemplate.tt + + + + + + TextTemplatingFilePreprocessor + EnumTemplate.cs + + + TextTemplatingFilePreprocessor + FormatterTemplate.cs + + + TextTemplatingFilePreprocessor + ResolverTemplate.cs + + + TextTemplatingFilePreprocessor + UnionTemplate.cs + + + + + + + diff --git a/src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json b/src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json new file mode 100644 index 000000000..f879103ca --- /dev/null +++ b/src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "MessagePack.UniversalCodeGenerator": { + "commandName": "Project", + "commandLineArgs": "-i .\\sandbox\\shareddata\\shareddata.csproj -o .\\sandbox\\Sandbox\\Generated.cs", + "workingDirectory": "D:\\git\\MessagePack-CSharp" + } + } +} \ No newline at end of file From ca0e04e499c4faed0399c17d670851efca5986b5 Mon Sep 17 00:00:00 2001 From: itn3000 Date: Tue, 29 Jan 2019 12:12:46 +0900 Subject: [PATCH 038/105] fix DataContractTest compilation(missing variable named serializer) --- tests/MessagePack.Tests/DataContractTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/MessagePack.Tests/DataContractTest.cs b/tests/MessagePack.Tests/DataContractTest.cs index 7c1969ec7..916d74963 100644 --- a/tests/MessagePack.Tests/DataContractTest.cs +++ b/tests/MessagePack.Tests/DataContractTest.cs @@ -112,8 +112,8 @@ public void Serialize_WithVariousAttributes() IgnoredField = 6, }; - var bin = serializer.Serialize(mc); - var mc2 = serializer.Deserialize(bin); + var bin = MessagePackSerializer.Serialize(mc); + var mc2 = MessagePackSerializer.Deserialize(bin); mc2.AttributedProperty.Is(mc.AttributedProperty); mc2.AttributedField.Is(mc.AttributedField); @@ -123,7 +123,7 @@ public void Serialize_WithVariousAttributes() mc2.UnattributedField.Is(0); mc2.IgnoredField.Is(0); - serializer.ToJson(bin).Is(@"{""AttributedProperty"":1,""AttributedField"":4}"); + MessagePackSerializer.ToJson(bin).Is(@"{""AttributedProperty"":1,""AttributedField"":4}"); } } } From 1bd1c640007cfc657bd751e7e0d0a21d802e410e Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 29 Jan 2019 20:08:13 -0800 Subject: [PATCH 039/105] Re-apply public releases --- version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.json b/version.json index 9722d25e2..c1ecc3c44 100644 --- a/version.json +++ b/version.json @@ -5,7 +5,7 @@ "precision": "revision" }, "publicReleaseRefSpec": [ - //"^refs/heads/master$", // we release out of master - //"^refs/heads/v\\d+(?:.\\d+)?$" // we also release out of vNN branches + "^refs/heads/master$", // we release out of master + "^refs/heads/v\\d+(?:.\\d+)?$" // we also release out of vNN branches ] } From 377e8b306428c5cccdbfdb7f87c27084c044d727 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 30 Jan 2019 23:48:55 -0800 Subject: [PATCH 040/105] Fix package project URL --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 250cd162a..bff70e3f6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,7 +14,7 @@ neuecc neuecc © Yoshifumi Kawai. All rights reserved. - https://github.com/AArnott/MessagePack-CSharp + https://github.com/neuecc/MessagePack-CSharp true true From 37d8a1226062e16a4d53123e6fc6b782b0d111a1 Mon Sep 17 00:00:00 2001 From: itn3000 Date: Fri, 1 Feb 2019 13:19:58 +0900 Subject: [PATCH 041/105] throw exception when getting attribute's metadata is failed.(#355) --- .../CodeAnalysis/TypeCollector.cs | 32 +++++++++++++++++++ .../Utils/RoslynExtensions.cs | 5 +-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs index 6dd4a42cc..ee21819a8 100644 --- a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs @@ -20,14 +20,46 @@ public class ReferenceSymbols public ReferenceSymbols(Compilation compilation) { TaskOfT = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1"); + if(TaskOfT == null) + { + throw new InvalidOperationException("failed to get metadata of System.Threading.Tasks.Task`1"); + } Task = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task"); + if (Task == null) + { + throw new InvalidOperationException("failed to get metadata of System.Threading.Tasks.Task"); + } MessagePackObjectAttribute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute"); + if (MessagePackObjectAttribute == null) + { + throw new InvalidOperationException("failed to get metadata of MessagePack.MessagePackObjectAttribute"); + } UnionAttribute = compilation.GetTypeByMetadataName("MessagePack.UnionAttribute"); + if (UnionAttribute == null) + { + throw new InvalidOperationException("failed to get metadata of MessagePack.UnionAttribute"); + } SerializationConstructorAttribute = compilation.GetTypeByMetadataName("MessagePack.SerializationConstructorAttribute"); + if (SerializationConstructorAttribute == null) + { + throw new InvalidOperationException("failed to get metadata of MessagePack.SerializationConstructorAttribute"); + } KeyAttribute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute"); + if (KeyAttribute == null) + { + throw new InvalidOperationException("failed to get metadata of MessagePack.KeyAttribute"); + } IgnoreAttribute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute"); + if (IgnoreAttribute == null) + { + throw new InvalidOperationException("failed to get metadata of MessagePack.IgnoreMemberAttribute"); + } IgnoreDataMemberAttribute = compilation.GetTypeByMetadataName("System.Runtime.Serialization.IgnoreDataMemberAttribute"); IMessagePackSerializationCallbackReceiver = compilation.GetTypeByMetadataName("MessagePack.IMessagePackSerializationCallbackReceiver"); + if (IMessagePackSerializationCallbackReceiver == null) + { + throw new InvalidOperationException("failed to get metadata of MessagePack.IMessagePackSerializationCallbackReceiver"); + } } } diff --git a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs index da80520c7..3274f983c 100644 --- a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs +++ b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs @@ -25,7 +25,8 @@ internal static class RoslynExtensions // https://github.com/daveaglick/Buildalyzer/blob/b42d2e3ba1b3673a8133fb41e72b507b01bce1d6/src/Buildalyzer/Environment/BuildEnvironment.cs#L86-L96 Dictionary properties = new Dictionary() { - {"IntermediateOutputPath", tempPath}, + // trailing '\' may cause unexpected escape + {"IntermediateOutputPath", tempPath + "/"}, {"ProviderCommandLineArgs", "true"}, {"GenerateResourceMSBuildArchitecture", "CurrentArchitecture"}, {"DesignTimeBuild", "true"}, @@ -40,7 +41,7 @@ internal static class RoslynExtensions {"UseCommonOutputDirectory", "true"}, {"GeneratePackageOnBuild", "false"}, {"RunPostBuildEvent", "false"}, - {"SolutionDir", new FileInfo(csprojPath).FullName} + {"SolutionDir", (new FileInfo(csprojPath).Directory.FullName) + "/"} }; var propargs = string.Join(" ", properties.Select(kv => $"/p:{kv.Key}=\"{kv.Value}\"")); // how to determine whether command should be executed('dotnet msbuild' or 'msbuild')? From 893f1f2f0cbec98e3f7167c24e082a014952416e Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 1 Feb 2019 09:20:04 -0800 Subject: [PATCH 042/105] Restore badges to README These badges were inadvertently removed in #378. This brings them back. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index bad1cba6d..e3feabc70 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ MessagePack for C# (.NET, .NET Core, Unity, Xamarin) [![Build Status](https://dev.azure.com/andrewarnott/OSS/_apis/build/status/MessagePack)](https://dev.azure.com/andrewarnott/OSS/_build/latest?definitionId=24) [![NuGet](https://img.shields.io/nuget/v/MessagePack.svg)](https://www.nuget.org/packages/messagepack) +[![Releases](https://img.shields.io/github/release/neuecc/MessagePack-CSharp.svg)](https://github.com/neuecc/MessagePack-CSharp/releases) + +[![Join the chat at https://gitter.im/MessagePack-CSharp/Lobby](https://badges.gitter.im/MessagePack-CSharp/Lobby.svg)](https://gitter.im/MessagePack-CSharp/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) The extremely fast [MessagePack](http://msgpack.org/) serializer for C#. It is 10x faster than [MsgPack-Cli](https://github.com/msgpack/msgpack-cli) and outperforms other C# serializers. MessagePack for C# also ships with built-in support for LZ4 compression - an extremely fast compression algorithm. Performance is important, particularly in applications like game development, distributed computing, microservice architecture, and caching. From 0ad806b96de7ee21b42c87ca8e9c01783a0d3f16 Mon Sep 17 00:00:00 2001 From: Dzmitry Lahoda Date: Wed, 6 Feb 2019 20:32:10 +0300 Subject: [PATCH 043/105] some consistency for unity copy paste from readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e3feabc70..599f91c85 100644 --- a/README.md +++ b/README.md @@ -1241,7 +1241,7 @@ MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault( // finally, use builtin/primitive resolver(don't use StandardResolver, it includes dynamic generation) MessagePack.Resolvers.BuiltinResolver.Instance, - AttributeFormatterResolver.Instance, + MessagePack.Resolvers.AttributeFormatterResolver.Instance, MessagePack.Resolvers.PrimitiveObjectResolver.Instance ); ``` From 96cbc37665761d739a92c1e98b90fe80d435c928 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 9 Feb 2019 08:25:57 -0800 Subject: [PATCH 044/105] Set build number across forked builds --- azure-pipelines/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index ba65a7457..5b3534473 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -11,7 +11,7 @@ steps: dotnet tool install --tool-path . nbgv .\nbgv cloud -p src displayName: Set build number - condition: ne(variables['system.pullrequest.isfork'], true) + - task: PowerShell@2 displayName: Set VSTS variables inputs: From f5569bb3569237c3a18c349308cc01ada5525492 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 9 Feb 2019 08:27:06 -0800 Subject: [PATCH 045/105] Remove the rest of the isfork checks --- azure-pipelines/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 5b3534473..30a4af7f8 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -89,7 +89,7 @@ steps: ArtifactName: projectAssetsJson ArtifactType: Container displayName: Publish projectAssetsJson artifacts - condition: and(succeededOrFailed(), ne(variables['system.pullrequest.isfork'], true)) + condition: succeededOrFailed() - task: PublishBuildArtifacts@1 inputs: @@ -97,7 +97,7 @@ steps: ArtifactName: build_logs ArtifactType: Container displayName: Publish build_logs artifacts - condition: and(succeededOrFailed(), ne(variables['system.pullrequest.isfork'], true)) + condition: succeededOrFailed() ## The rest of these steps are for deployment and skipped for PR builds @@ -106,7 +106,7 @@ steps: # PathtoPublish: $(build.sourcesdirectory)/bin # ArtifactName: bin # ArtifactType: Container -# condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), ne(variables['system.pullrequest.isfork'], true)) +# condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}: - template: azure-pipeline.microbuild.after.yml @@ -126,4 +126,4 @@ steps: ArtifactName: deployables ArtifactType: Container displayName: Publish deployables artifacts - condition: and(succeededOrFailed(), ne(variables['system.pullrequest.isfork'], true)) + condition: succeededOrFailed() From 9f2284b26e426ebb736db38546b5f2a3b49005e2 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 11 Feb 2019 18:07:37 -0800 Subject: [PATCH 046/105] Update Azure Pipelines badge This sets it to refer to @neuecc's Pipeline instead of my own. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 599f91c85..34f3cb74f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ MessagePack for C# (.NET, .NET Core, Unity, Xamarin) === -[![Build Status](https://dev.azure.com/andrewarnott/OSS/_apis/build/status/MessagePack)](https://dev.azure.com/andrewarnott/OSS/_build/latest?definitionId=24) +[![Build Status](https://dev.azure.com/ils0086/MessagePack-CSharp/_apis/build/status/MessagePack-CSharp-CI)](https://dev.azure.com/ils0086/MessagePack-CSharp/_build/latest?definitionId=2) [![NuGet](https://img.shields.io/nuget/v/MessagePack.svg)](https://www.nuget.org/packages/messagepack) [![Releases](https://img.shields.io/github/release/neuecc/MessagePack-CSharp.svg)](https://github.com/neuecc/MessagePack-CSharp/releases) From 99a58e6a2775e6a080698a50c259a13699c2302d Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 19 Jan 2019 18:51:36 -0800 Subject: [PATCH 047/105] Add docs for updating Generated.cs --- sandbox/Sandbox/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 sandbox/Sandbox/README.md diff --git a/sandbox/Sandbox/README.md b/sandbox/Sandbox/README.md new file mode 100644 index 000000000..68f94c326 --- /dev/null +++ b/sandbox/Sandbox/README.md @@ -0,0 +1,9 @@ +# Updating Generated.cs + +Generated.cs is a generated file and should not be edited manually. +To update Generated.cs, follow these steps: + + dotnet build src\MessagePack -f netstandard1.6 + dotnet run -p src\MessagePack.UniversalCodeGenerator -- -i sandbox\SharedData\SharedData.csproj -o sandbox\sandbox\Generated.cs + +The first step is because `sandbox\SharedProject` references it and MPC doesn't build project references during code gen. From fd68de1536978d4c7628d6ba749462dd50f0ab70 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 15 Feb 2019 07:47:15 -0800 Subject: [PATCH 048/105] Stop generating code for indexers Workaround for neuecc#390 --- sandbox/Sandbox/Generated.cs | 423 ++++++++++-------- .../CodeAnalysis/TypeCollector.cs | 1 + 2 files changed, 244 insertions(+), 180 deletions(-) diff --git a/sandbox/Sandbox/Generated.cs b/sandbox/Sandbox/Generated.cs index fbfcaf5e2..92be2e836 100644 --- a/sandbox/Sandbox/Generated.cs +++ b/sandbox/Sandbox/Generated.cs @@ -43,7 +43,7 @@ internal static class GeneratedResolverGetFormatterHelper static GeneratedResolverGetFormatterHelper() { - lookup = new global::System.Collections.Generic.Dictionary(64) + lookup = new global::System.Collections.Generic.Dictionary(65) { {typeof(int[,]), 0 }, {typeof(global::GlobalMyEnum[,]), 1 }, @@ -99,16 +99,17 @@ static GeneratedResolverGetFormatterHelper() {typeof(global::SharedData.NestParent.NestContract), 51 }, {typeof(global::SharedData.FooClass), 52 }, {typeof(global::SharedData.BarClass), 53 }, - {typeof(global::Abcdefg.Efcdigjl.Ateatatea.Hgfagfafgad.TnonodsfarnoiuAtatqaga), 54 }, - {typeof(global::GlobalMan), 55 }, - {typeof(global::Message), 56 }, - {typeof(global::TextMessageBody), 57 }, - {typeof(global::StampMessageBody), 58 }, - {typeof(global::QuestMessageBody), 59 }, - {typeof(global::ArrayTestTest), 60 }, - {typeof(global::SimpleModel), 61 }, - {typeof(global::ComplexModel), 62 }, - {typeof(global::PerfBenchmarkDotNet.StringKeySerializerTarget), 63 }, + {typeof(global::SharedData.WithIndexer), 54 }, + {typeof(global::Abcdefg.Efcdigjl.Ateatatea.Hgfagfafgad.TnonodsfarnoiuAtatqaga), 55 }, + {typeof(global::GlobalMan), 56 }, + {typeof(global::Message), 57 }, + {typeof(global::TextMessageBody), 58 }, + {typeof(global::StampMessageBody), 59 }, + {typeof(global::QuestMessageBody), 60 }, + {typeof(global::ArrayTestTest), 61 }, + {typeof(global::SimpleModel), 62 }, + {typeof(global::ComplexModel), 63 }, + {typeof(global::PerfBenchmarkDotNet.StringKeySerializerTarget), 64 }, }; } @@ -173,23 +174,24 @@ internal static object GetFormatter(Type t) case 51: return new MessagePack.Formatters.SharedData.NestParent_NestContractFormatter(); case 52: return new MessagePack.Formatters.SharedData.FooClassFormatter(); case 53: return new MessagePack.Formatters.SharedData.BarClassFormatter(); - case 54: return new MessagePack.Formatters.Abcdefg.Efcdigjl.Ateatatea.Hgfagfafgad.TnonodsfarnoiuAtatqagaFormatter(); - case 55: return new MessagePack.Formatters.GlobalManFormatter(); - case 56: return new MessagePack.Formatters.MessageFormatter(); - case 57: return new MessagePack.Formatters.TextMessageBodyFormatter(); - case 58: return new MessagePack.Formatters.StampMessageBodyFormatter(); - case 59: return new MessagePack.Formatters.QuestMessageBodyFormatter(); - case 60: return new MessagePack.Formatters.ArrayTestTestFormatter(); - case 61: return new MessagePack.Formatters.SimpleModelFormatter(); - case 62: return new MessagePack.Formatters.ComplexModelFormatter(); - case 63: return new MessagePack.Formatters.PerfBenchmarkDotNet.StringKeySerializerTargetFormatter(); + case 54: return new MessagePack.Formatters.SharedData.WithIndexerFormatter(); + case 55: return new MessagePack.Formatters.Abcdefg.Efcdigjl.Ateatatea.Hgfagfafgad.TnonodsfarnoiuAtatqagaFormatter(); + case 56: return new MessagePack.Formatters.GlobalManFormatter(); + case 57: return new MessagePack.Formatters.MessageFormatter(); + case 58: return new MessagePack.Formatters.TextMessageBodyFormatter(); + case 59: return new MessagePack.Formatters.StampMessageBodyFormatter(); + case 60: return new MessagePack.Formatters.QuestMessageBodyFormatter(); + case 61: return new MessagePack.Formatters.ArrayTestTestFormatter(); + case 62: return new MessagePack.Formatters.SimpleModelFormatter(); + case 63: return new MessagePack.Formatters.ComplexModelFormatter(); + case 64: return new MessagePack.Formatters.PerfBenchmarkDotNet.StringKeySerializerTargetFormatter(); default: return null; } } } } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -210,7 +212,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.ByteEnum v { return MessagePackBinary.WriteByte(ref bytes, offset, (Byte)value); } - + public global::SharedData.ByteEnum Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { return (global::SharedData.ByteEnum)MessagePackBinary.ReadByte(bytes, offset, out readSize); @@ -220,7 +222,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.ByteEnum v } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -240,7 +242,7 @@ public int Serialize(ref byte[] bytes, int offset, global::GlobalMyEnum value, g { return MessagePackBinary.WriteInt32(ref bytes, offset, (Int32)value); } - + public global::GlobalMyEnum Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { return (global::GlobalMyEnum)MessagePackBinary.ReadInt32(bytes, offset, out readSize); @@ -250,7 +252,7 @@ public int Serialize(ref byte[] bytes, int offset, global::GlobalMyEnum value, g } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -320,7 +322,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IUnionChecker Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -330,7 +332,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker"); @@ -368,9 +370,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -429,7 +431,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IUnionChecker2 Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -439,7 +441,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker2"); @@ -477,9 +479,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -523,7 +525,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IIVersioningUnion Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -533,7 +535,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IIVersioningUnion"); @@ -559,9 +561,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -610,7 +612,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.RootUnionType Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -620,7 +622,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.RootUnionType"); @@ -650,9 +652,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -701,7 +703,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::SharedData.IUnionSample Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -711,7 +713,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionSample"); @@ -741,9 +743,9 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -751,7 +753,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -815,7 +817,7 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g return MessagePackBinary.WriteNil(ref bytes, offset); } - + public global::IMessageBody Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) { if (MessagePackBinary.IsNil(bytes, offset)) @@ -825,7 +827,7 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g } var startOffset = offset; - + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) { throw new InvalidOperationException("Invalid Union data was detected. Type:global::IMessageBody"); @@ -859,9 +861,9 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g offset += MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + readSize = offset - startOffset; - + return result; } } @@ -869,7 +871,7 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -894,7 +896,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FirstSimpl { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Prop1); @@ -969,10 +971,10 @@ public SimpleStringKeyDataFormatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("Prop1"), - global::System.Text.Encoding.UTF8.GetBytes("Prop2"), - global::System.Text.Encoding.UTF8.GetBytes("Prop3"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Prop1"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Prop2"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Prop3"), + }; } @@ -983,14 +985,14 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStri { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 3); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Prop1); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[1]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[1]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Prop2, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[2]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[2]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Prop3); return offset - startOffset; } @@ -1037,7 +1039,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStri readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -1058,7 +1060,7 @@ public sealed class SimpleStructIntKeyDataFormatter : global::MessagePack.Format public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStructIntKeyData value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.X); @@ -1131,21 +1133,21 @@ public SimpleStructStringKeyDataFormatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("key-X"), - global::System.Text.Encoding.UTF8.GetBytes("key-Y"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("key-X"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("key-Y"), + }; } public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStructStringKeyData value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 2); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.X); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[1]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[1]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Y, formatterResolver); return offset - startOffset; } @@ -1187,7 +1189,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStru readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -1211,7 +1213,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleIntK { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 7); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Prop1); @@ -1298,7 +1300,7 @@ public sealed class Vector2Formatter : global::MessagePack.Formatters.IMessagePa public int Serialize(ref byte[] bytes, int offset, global::SharedData.Vector2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.X); @@ -1356,7 +1358,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.EmptyClass { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -1401,7 +1403,7 @@ public sealed class EmptyStructFormatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.EmptyStruct value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -1449,7 +1451,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version1 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 6); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -1519,7 +1521,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version2 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 8); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -1596,7 +1598,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version0 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 4); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -1654,7 +1656,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV1 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty1, formatterResolver); @@ -1715,7 +1717,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV2 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty1, formatterResolver); @@ -1776,7 +1778,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV0 v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty1, formatterResolver); @@ -1837,7 +1839,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback1 { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + value.OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); @@ -1894,7 +1896,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback1_ { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); @@ -1957,19 +1959,19 @@ public Callback2Formatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("X"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("X"), + }; } public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + value.OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 1); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.X); return offset - startOffset; } @@ -2007,7 +2009,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2 readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2037,19 +2039,19 @@ public Callback2_2Formatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("X"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("X"), + }; } public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2_2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(); var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 1); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.X); return offset - startOffset; } @@ -2087,7 +2089,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2_ readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2111,7 +2113,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SubUnionTy { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2172,7 +2174,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SubUnionTy { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2233,7 +2235,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 4); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2287,7 +2289,7 @@ public sealed class MySubUnion2Formatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 6); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2346,7 +2348,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2399,7 +2401,7 @@ public sealed class MySubUnion4Formatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion4 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 8); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2460,7 +2462,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Versioning { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 8); offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); @@ -2522,7 +2524,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MyClass va { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty1); @@ -2589,7 +2591,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.VersionBlo { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2656,7 +2658,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.UnVersionB { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2718,7 +2720,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty1 val { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -2772,7 +2774,7 @@ public Empty2Formatter() this.____stringByteKeys = new byte[][] { - + }; } @@ -2783,7 +2785,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty2 val { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 0); return offset - startOffset; @@ -2819,7 +2821,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty2 val readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2841,7 +2843,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty1 { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -2902,8 +2904,8 @@ public NonEmpty2Formatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("MyProperty"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty"), + }; } @@ -2914,10 +2916,10 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty2 { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 1); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); return offset - startOffset; } @@ -2956,7 +2958,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty2 readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -2975,7 +2977,7 @@ public sealed class VectorLike2Formatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.VectorLike2 value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.x); @@ -3031,7 +3033,7 @@ public sealed class Vector3LikeFormatter : global::MessagePack.Formatters.IMessa public int Serialize(ref byte[] bytes, int offset, global::SharedData.Vector3Like value, global::MessagePack.IFormatterResolver formatterResolver) { - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 3); offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.x); @@ -3097,7 +3099,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.ArrayOptim { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref bytes, offset, 16); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty0); @@ -3242,7 +3244,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NestParent { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -3297,7 +3299,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FooClass v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.XYZ); @@ -3352,7 +3354,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.BarClass v { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.OPQ, formatterResolver); @@ -3397,9 +3399,70 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.BarClass v } } + + public sealed class WithIndexerFormatter : global::MessagePack.Formatters.IMessagePackFormatter + { + + public int Serialize(ref byte[] bytes, int offset, global::SharedData.WithIndexer value, global::MessagePack.IFormatterResolver formatterResolver) + { + if (value == null) + { + return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); + } + + var startOffset = offset; + offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); + offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Data1); + offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Data2, formatterResolver); + return offset - startOffset; + } + + public global::SharedData.WithIndexer Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize) + { + if (global::MessagePack.MessagePackBinary.IsNil(bytes, offset)) + { + readSize = 1; + return null; + } + + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; + + var __Data1__ = default(int); + var __Data2__ = default(string); + + for (int i = 0; i < length; i++) + { + var key = i; + + switch (key) + { + case 0: + __Data1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Data2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; + } + + readSize = offset - startOffset; + + var ____result = new global::SharedData.WithIndexer(); + ____result.Data1 = __Data1__; + ____result.Data2 = __Data2__; + return ____result; + } + } + } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -3423,7 +3486,7 @@ public int Serialize(ref byte[] bytes, int offset, global::Abcdefg.Efcdigjl.Atea { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -3470,7 +3533,7 @@ public int Serialize(ref byte[] bytes, int offset, global::Abcdefg.Efcdigjl.Atea } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -3494,7 +3557,7 @@ public int Serialize(ref byte[] bytes, int offset, global::GlobalMan value, glob { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty); @@ -3549,7 +3612,7 @@ public int Serialize(ref byte[] bytes, int offset, global::Message value, global { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 4); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.UserId); @@ -3622,7 +3685,7 @@ public int Serialize(ref byte[] bytes, int offset, global::TextMessageBody value { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Text, formatterResolver); @@ -3677,7 +3740,7 @@ public int Serialize(ref byte[] bytes, int offset, global::StampMessageBody valu { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 1); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.StampId); @@ -3732,7 +3795,7 @@ public int Serialize(ref byte[] bytes, int offset, global::QuestMessageBody valu { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.QuestId); @@ -3793,7 +3856,7 @@ public int Serialize(ref byte[] bytes, int offset, global::ArrayTestTest value, { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 7); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.MyProperty0, formatterResolver); @@ -3895,13 +3958,13 @@ public SimpleModelFormatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("Id"), - global::System.Text.Encoding.UTF8.GetBytes("Name"), - global::System.Text.Encoding.UTF8.GetBytes("CreatedOn"), - global::System.Text.Encoding.UTF8.GetBytes("Precision"), - global::System.Text.Encoding.UTF8.GetBytes("Money"), - global::System.Text.Encoding.UTF8.GetBytes("Amount"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Id"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Name"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("CreatedOn"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Precision"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Money"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Amount"), + }; } @@ -3912,20 +3975,20 @@ public int Serialize(ref byte[] bytes, int offset, global::SimpleModel value, gl { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 6); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Id); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[1]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[1]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Name, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[2]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[2]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.CreatedOn, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[3]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[3]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.Precision); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[4]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[4]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Money, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[5]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[5]); offset += MessagePackBinary.WriteInt64(ref bytes, offset, value.Amount); return offset - startOffset; } @@ -3984,7 +4047,7 @@ public int Serialize(ref byte[] bytes, int offset, global::SimpleModel value, gl readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -4022,13 +4085,13 @@ public ComplexModelFormatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("AdditionalProperty"), - global::System.Text.Encoding.UTF8.GetBytes("CreatedOn"), - global::System.Text.Encoding.UTF8.GetBytes("Id"), - global::System.Text.Encoding.UTF8.GetBytes("Name"), - global::System.Text.Encoding.UTF8.GetBytes("UpdatedOn"), - global::System.Text.Encoding.UTF8.GetBytes("SimpleModels"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("AdditionalProperty"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("CreatedOn"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Id"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("Name"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("UpdatedOn"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("SimpleModels"), + }; } @@ -4039,20 +4102,20 @@ public int Serialize(ref byte[] bytes, int offset, global::ComplexModel value, g { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 6); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += formatterResolver.GetFormatterWithVerify>().Serialize(ref bytes, offset, value.AdditionalProperty, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[1]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[1]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.CreatedOn, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[2]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[2]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Id, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[3]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[3]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.Name, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[4]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[4]); offset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, value.UpdatedOn, formatterResolver); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[5]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[5]); offset += formatterResolver.GetFormatterWithVerify>().Serialize(ref bytes, offset, value.SimpleModels, formatterResolver); return offset - startOffset; } @@ -4111,7 +4174,7 @@ public int Serialize(ref byte[] bytes, int offset, global::ComplexModel value, g readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -4129,7 +4192,7 @@ public int Serialize(ref byte[] bytes, int offset, global::ComplexModel value, g } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 @@ -4167,16 +4230,16 @@ public StringKeySerializerTargetFormatter() this.____stringByteKeys = new byte[][] { - global::System.Text.Encoding.UTF8.GetBytes("MyProperty1"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty2"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty3"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty4"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty5"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty6"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty7"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty8"), - global::System.Text.Encoding.UTF8.GetBytes("MyProperty9"), - + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty1"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty2"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty3"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty4"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty5"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty6"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty7"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty8"), + global::MessagePack.MessagePackBinary.GetEncodedStringBytes("MyProperty9"), + }; } @@ -4187,26 +4250,26 @@ public int Serialize(ref byte[] bytes, int offset, global::PerfBenchmarkDotNet.S { return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset); } - + var startOffset = offset; offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUnsafe(ref bytes, offset, 9); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[0]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[0]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty1); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[1]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[1]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty2); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[2]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[2]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty3); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[3]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[3]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty4); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[4]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[4]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty5); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[5]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[5]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty6); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[6]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[6]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty7); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[7]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[7]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty8); - offset += global::MessagePack.MessagePackBinary.WriteStringBytes(ref bytes, offset, this.____stringByteKeys[8]); + offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, offset, this.____stringByteKeys[8]); offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.MyProperty9); return offset - startOffset; } @@ -4277,7 +4340,7 @@ public int Serialize(ref byte[] bytes, int offset, global::PerfBenchmarkDotNet.S readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); break; } - + NEXT_LOOP: offset += readSize; } @@ -4300,7 +4363,7 @@ public int Serialize(ref byte[] bytes, int offset, global::PerfBenchmarkDotNet.S } -#pragma warning disable 168 +#pragma warning restore 168 #pragma warning restore 414 #pragma warning restore 618 #pragma warning restore 612 diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs index ee21819a8..3b4ff0d1a 100644 --- a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs @@ -563,6 +563,7 @@ void CollectObject(INamedTypeSymbol type) foreach (var item in type.GetAllMembers().OfType()) { + if (item.IsIndexer) continue; // .tt files don't generate good code for this yet: https://github.com/neuecc/MessagePack-CSharp/issues/390 if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue; var member = new MemberSerializationInfo From f843caadb79e0a2ed34754a2e4e1c6934cce1dd6 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 15 Feb 2019 07:47:23 -0800 Subject: [PATCH 049/105] Fix typo in local variable name --- .../CodeAnalysis/TypeCollector.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs index 3b4ff0d1a..8b3e9ff64 100644 --- a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs @@ -502,7 +502,7 @@ void CollectObject(INamedTypeSymbol type) } var isIntKey = true; - var intMemebrs = new Dictionary(); + var intMembers = new Dictionary(); var stringMembers = new Dictionary(); if (isForceUseMap || (bool)contractAttr.ConstructorArguments[0].Value) @@ -601,9 +601,9 @@ void CollectObject(INamedTypeSymbol type) if (isIntKey) { member.IntKey = (int)intKey; - if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); + if (intMembers.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); - intMemebrs.Add(member.IntKey, member); + intMembers.Add(member.IntKey, member); } else { @@ -657,9 +657,9 @@ void CollectObject(INamedTypeSymbol type) if (isIntKey) { member.IntKey = (int)intKey; - if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); + if (intMembers.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) + " member:" + item.Name); - intMemebrs.Add(member.IntKey, member); + intMembers.Add(member.IntKey, member); } else { @@ -706,7 +706,7 @@ void CollectObject(INamedTypeSymbol type) MemberSerializationInfo paramMember; if (isIntKey) { - if (intMemebrs.TryGetValue(ctorParamIndex, out paramMember)) + if (intMembers.TryGetValue(ctorParamIndex, out paramMember)) { if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable) { @@ -812,7 +812,7 @@ void CollectObject(INamedTypeSymbol type) IsClass = isClass, ConstructorParameters = constructorParameters.ToArray(), IsIntKey = isIntKey, - Members = (isIntKey) ? intMemebrs.Values.ToArray() : stringMembers.Values.ToArray(), + Members = (isIntKey) ? intMembers.Values.ToArray() : stringMembers.Values.ToArray(), Name = type.ToDisplayString(shortTypeNameFormat).Replace(".", "_"), FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), From 23a5920368c53ef6448a0fdf0a0f93bf62f29115 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 15 Feb 2019 08:42:18 -0800 Subject: [PATCH 050/105] .gitignore for launchSettings.json --- .gitignore | 1 + MessagePack.sln | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 78087f6a6..16768f8f6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.user *.userosscache *.sln.docstates +launchSettings.json # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs diff --git a/MessagePack.sln b/MessagePack.sln index ba71e6406..96b975619 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -59,6 +59,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.UniversalCodeGe EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.AspNetCoreMvcFormatter.Tests", "tests\MessagePack.AspNetCoreMvcFormatter.Tests\MessagePack.AspNetCoreMvcFormatter.Tests.csproj", "{79C2B2CB-872A-4BA9-82DC-60F6DD77F940}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5BAF9120-1293-449E-975C-A373E9DE7F69}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From b5d610976464bf8ba245bb04ee89f735dd53ede4 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 15 Feb 2019 21:03:43 -0800 Subject: [PATCH 051/105] Set up event source for easier perf investigations --- .../PerfNetFramework/BenchmarkEventSource.cs | 75 +++++++++++++++++++ sandbox/PerfNetFramework/Program.cs | 30 +++++++- sandbox/PerfNetFramework/README.md | 26 +++++++ 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 sandbox/PerfNetFramework/BenchmarkEventSource.cs create mode 100644 sandbox/PerfNetFramework/README.md diff --git a/sandbox/PerfNetFramework/BenchmarkEventSource.cs b/sandbox/PerfNetFramework/BenchmarkEventSource.cs new file mode 100644 index 000000000..a2fbd237d --- /dev/null +++ b/sandbox/PerfNetFramework/BenchmarkEventSource.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PerfNetFramework +{ + [EventSource(Name = "MessagePack-Benchmark")] + internal sealed class BenchmarkEventSource : EventSource + { + private const int MessagePackSerializeStartEvent = 1; + private const int MessagePackSerializeStopEvent = 2; + private const int MessagePackDeserializeStartEvent = 3; + private const int MessagePackDeserializeStopEvent = 4; + private const int MessagePackSessionStartEvent = 5; + private const int MessagePackSessionStopEvent = 6; + + internal static readonly BenchmarkEventSource Instance = new BenchmarkEventSource(); + + private BenchmarkEventSource() { } + + /// + /// Marks the start of a serialization benchmark. + /// + /// The library performing the serialization. + [Event(MessagePackSerializeStartEvent, Task = Tasks.Serialize, Opcode = EventOpcode.Start)] + public void Serialize(string impl) + { + this.WriteEvent(MessagePackSerializeStartEvent, impl); + } + + [Event(MessagePackSerializeStopEvent, Task = Tasks.Serialize, Opcode = EventOpcode.Stop)] + public void SerializeEnd() + { + this.WriteEvent(MessagePackSerializeStopEvent); + } + + /// + /// Marks the start of a deserialization benchmark. + /// + /// The library performing the serialization. + [Event(MessagePackDeserializeStartEvent, Task = Tasks.Deserialize, Opcode = EventOpcode.Start)] + public void Deserialize(string impl) + { + this.WriteEvent(MessagePackDeserializeStartEvent, impl); + } + + [Event(MessagePackDeserializeStopEvent, Task = Tasks.Deserialize, Opcode = EventOpcode.Stop)] + public void DeserializeEnd() + { + this.WriteEvent(MessagePackDeserializeStopEvent); + } + + [Event(MessagePackSessionStartEvent, Task = Tasks.Session, Opcode = EventOpcode.Start)] + public void Session(int count) + { + this.WriteEvent(MessagePackSessionStartEvent, count); + } + + [Event(MessagePackSessionStopEvent, Task = Tasks.Session, Opcode = EventOpcode.Stop)] + public void SessionEnd() + { + this.WriteEvent(MessagePackSessionStopEvent); + } + + internal static class Tasks + { + internal const EventTask Session = (EventTask)1; + internal const EventTask Serialize = (EventTask)2; + internal const EventTask Deserialize = (EventTask)3; + } + } +} diff --git a/sandbox/PerfNetFramework/Program.cs b/sandbox/PerfNetFramework/Program.cs index 820b3beb6..d1f810075 100644 --- a/sandbox/PerfNetFramework/Program.cs +++ b/sandbox/PerfNetFramework/Program.cs @@ -14,7 +14,7 @@ using System.Text; using System.IO.Compression; -namespace PerfnetFramework +namespace PerfNetFramework { [ZeroFormattable] [ProtoBuf.ProtoContract] @@ -55,6 +55,8 @@ public enum Sex : sbyte class Program { + internal static bool deserializing; + static void Main(string[] args) { var p = new Person @@ -76,9 +78,14 @@ static void Main(string[] args) }) .ToArray(); + BenchmarkEventSource.Instance.Session(1); Benchmark(p); + BenchmarkEventSource.Instance.SessionEnd(); + Console.WriteLine(); + BenchmarkEventSource.Instance.Session(l.Length); Benchmark(l); + BenchmarkEventSource.Instance.SessionEnd(); } static void Benchmark(T target) @@ -99,6 +106,8 @@ static void Benchmark(T target) Console.WriteLine(); Console.WriteLine("Serialize::"); + deserializing = false; + byte[] data = null; byte[] data0 = null; byte[] data1 = null; @@ -212,6 +221,7 @@ static void Benchmark(T target) Console.WriteLine(); Console.WriteLine("Deserialize::"); + deserializing = true; using (new Measure("MsgPack-Cli")) { @@ -344,12 +354,30 @@ public Measure(string label) { this.label = label; System.GC.Collect(2, GCCollectionMode.Forced, blocking: true); + if (!Program.deserializing) + { + BenchmarkEventSource.Instance.Serialize(label); + } + else + { + BenchmarkEventSource.Instance.Deserialize(label); + } + this.sw = Stopwatch.StartNew(); } public void Dispose() { sw.Stop(); + if (!Program.deserializing) + { + BenchmarkEventSource.Instance.SerializeEnd(); + } + else + { + BenchmarkEventSource.Instance.DeserializeEnd(); + } + Console.WriteLine($"{ label,20} {sw.Elapsed.TotalMilliseconds} ms"); System.GC.Collect(2, GCCollectionMode.Forced, blocking: true); diff --git a/sandbox/PerfNetFramework/README.md b/sandbox/PerfNetFramework/README.md new file mode 100644 index 000000000..3c202c2be --- /dev/null +++ b/sandbox/PerfNetFramework/README.md @@ -0,0 +1,26 @@ +# Performance analysis + +Build and use the release configuration of the project so you're measuring real perf with optimizations turned on: + + dotnet build -c release .\sandbox\PerfNetFramework\ + +Use [PerfView](https://github.com/Microsoft/perfview/blob/master/documentation/Downloading.md) to analyze performance +to look for opportunities to improve. +When collecting ETL traces, use these settings in the Collect->Run dialog: + +| Setting | Value | +|-------------|-------| +| Command | `dotnet run -c release -p .\sandbox\PerfNetFramework\ -f net461 --no-build` +| Current Dir | `d:\git\messagepack-csharp` (or wherever your enlistment is) +| Additional Providers | `*MessagePack-Benchmark` +| No V3.X NGen | Checked + +Start your investigation using the Events window to find the scenario that you're interested in, +with these settings: + +| Setting | Value | +|------------|-------| +| Filter | `MessagePack` +| Columns to display | `count DURATION_MSEC impl` + +Select the two `Time MSec` values that bound the scenario you're interested in, right-click and select CPU Stacks. From e9fc0a1182a552ce4815891319c4473d8b7c3493 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 21 Feb 2019 20:15:51 -0800 Subject: [PATCH 052/105] Remove x86/x64 solution platforms --- MessagePack.sln | 135 ------------------------------------------------ 1 file changed, 135 deletions(-) diff --git a/MessagePack.sln b/MessagePack.sln index 96b975619..c6fb9e171 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -67,205 +67,73 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Debug|x64.ActiveCfg = Debug|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Debug|x64.Build.0 = Debug|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Debug|x86.ActiveCfg = Debug|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Debug|x86.Build.0 = Debug|Any CPU {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Release|Any CPU.ActiveCfg = Release|Any CPU {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Release|Any CPU.Build.0 = Release|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Release|x64.ActiveCfg = Release|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Release|x64.Build.0 = Release|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Release|x86.ActiveCfg = Release|Any CPU - {7ABB33EE-A2F1-492B-8DAF-5DF89F0F0B79}.Release|x86.Build.0 = Release|Any CPU {9E1A55CA-711D-4F58-A332-735960E3434C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9E1A55CA-711D-4F58-A332-735960E3434C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Debug|x64.ActiveCfg = Debug|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Debug|x64.Build.0 = Debug|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Debug|x86.ActiveCfg = Debug|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Debug|x86.Build.0 = Debug|Any CPU {9E1A55CA-711D-4F58-A332-735960E3434C}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E1A55CA-711D-4F58-A332-735960E3434C}.Release|Any CPU.Build.0 = Release|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Release|x64.ActiveCfg = Release|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Release|x64.Build.0 = Release|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Release|x86.ActiveCfg = Release|Any CPU - {9E1A55CA-711D-4F58-A332-735960E3434C}.Release|x86.Build.0 = Release|Any CPU {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Debug|x64.ActiveCfg = Debug|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Debug|x64.Build.0 = Debug|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Debug|x86.Build.0 = Debug|Any CPU {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|Any CPU.Build.0 = Release|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x64.ActiveCfg = Release|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x64.Build.0 = Release|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x86.ActiveCfg = Release|Any CPU - {ED43BDA5-947C-4769-A47A-F07D3C6142AE}.Release|x86.Build.0 = Release|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|x64.ActiveCfg = Debug|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|x64.Build.0 = Debug|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|x86.ActiveCfg = Debug|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Debug|x86.Build.0 = Debug|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E511130-F838-4B47-842B-0FB27AD175B5}.Release|Any CPU.Build.0 = Release|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Release|x64.ActiveCfg = Release|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Release|x64.Build.0 = Release|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Release|x86.ActiveCfg = Release|Any CPU - {8E511130-F838-4B47-842B-0FB27AD175B5}.Release|x86.Build.0 = Release|Any CPU {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Debug|x64.ActiveCfg = Debug|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Debug|x64.Build.0 = Debug|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Debug|x86.ActiveCfg = Debug|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Debug|x86.Build.0 = Debug|Any CPU {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Release|Any CPU.ActiveCfg = Release|Any CPU {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Release|Any CPU.Build.0 = Release|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Release|x64.ActiveCfg = Release|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Release|x64.Build.0 = Release|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Release|x86.ActiveCfg = Release|Any CPU - {3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}.Release|x86.Build.0 = Release|Any CPU {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Debug|x64.ActiveCfg = Debug|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Debug|x64.Build.0 = Debug|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Debug|x86.ActiveCfg = Debug|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Debug|x86.Build.0 = Debug|Any CPU {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Release|Any CPU.ActiveCfg = Release|Any CPU {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Release|Any CPU.Build.0 = Release|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Release|x64.ActiveCfg = Release|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Release|x64.Build.0 = Release|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Release|x86.ActiveCfg = Release|Any CPU - {C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}.Release|x86.Build.0 = Release|Any CPU {166A16C0-B89F-41AF-956A-235C6CA62C25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {166A16C0-B89F-41AF-956A-235C6CA62C25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Debug|x64.ActiveCfg = Debug|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Debug|x64.Build.0 = Debug|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Debug|x86.ActiveCfg = Debug|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Debug|x86.Build.0 = Debug|Any CPU {166A16C0-B89F-41AF-956A-235C6CA62C25}.Release|Any CPU.ActiveCfg = Release|Any CPU {166A16C0-B89F-41AF-956A-235C6CA62C25}.Release|Any CPU.Build.0 = Release|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Release|x64.ActiveCfg = Release|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Release|x64.Build.0 = Release|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Release|x86.ActiveCfg = Release|Any CPU - {166A16C0-B89F-41AF-956A-235C6CA62C25}.Release|x86.Build.0 = Release|Any CPU {E066F547-7261-4561-AEFC-E64DBFD874F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E066F547-7261-4561-AEFC-E64DBFD874F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Debug|x64.ActiveCfg = Debug|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Debug|x64.Build.0 = Debug|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Debug|x86.ActiveCfg = Debug|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Debug|x86.Build.0 = Debug|Any CPU {E066F547-7261-4561-AEFC-E64DBFD874F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {E066F547-7261-4561-AEFC-E64DBFD874F8}.Release|Any CPU.Build.0 = Release|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Release|x64.ActiveCfg = Release|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Release|x64.Build.0 = Release|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Release|x86.ActiveCfg = Release|Any CPU - {E066F547-7261-4561-AEFC-E64DBFD874F8}.Release|x86.Build.0 = Release|Any CPU {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Debug|x64.Build.0 = Debug|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Debug|x86.Build.0 = Debug|Any CPU {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Release|Any CPU.Build.0 = Release|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Release|x64.ActiveCfg = Release|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Release|x64.Build.0 = Release|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Release|x86.ActiveCfg = Release|Any CPU - {2F9A6E0C-DE95-4460-96B7-EB72BBEAEE9E}.Release|x86.Build.0 = Release|Any CPU {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Debug|x64.ActiveCfg = Debug|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Debug|x64.Build.0 = Debug|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Debug|x86.ActiveCfg = Debug|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Debug|x86.Build.0 = Debug|Any CPU {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Release|Any CPU.ActiveCfg = Release|Any CPU {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Release|Any CPU.Build.0 = Release|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Release|x64.ActiveCfg = Release|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Release|x64.Build.0 = Release|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Release|x86.ActiveCfg = Release|Any CPU - {09B87BEB-D9A3-4EEB-B56A-ED53D27DF1A3}.Release|x86.Build.0 = Release|Any CPU {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Debug|Any CPU.Build.0 = Debug|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Debug|x64.ActiveCfg = Debug|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Debug|x64.Build.0 = Debug|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Debug|x86.ActiveCfg = Debug|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Debug|x86.Build.0 = Debug|Any CPU {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Release|Any CPU.ActiveCfg = Release|Any CPU {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Release|Any CPU.Build.0 = Release|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Release|x64.ActiveCfg = Release|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Release|x64.Build.0 = Release|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Release|x86.ActiveCfg = Release|Any CPU - {014A3DCE-50A6-4774-A4C1-C66EEAB67133}.Release|x86.Build.0 = Release|Any CPU {17831017-C29C-4A48-B159-849BCE5079FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17831017-C29C-4A48-B159-849BCE5079FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Debug|x64.ActiveCfg = Debug|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Debug|x64.Build.0 = Debug|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Debug|x86.ActiveCfg = Debug|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Debug|x86.Build.0 = Debug|Any CPU {17831017-C29C-4A48-B159-849BCE5079FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {17831017-C29C-4A48-B159-849BCE5079FB}.Release|Any CPU.Build.0 = Release|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Release|x64.ActiveCfg = Release|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Release|x64.Build.0 = Release|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Release|x86.ActiveCfg = Release|Any CPU - {17831017-C29C-4A48-B159-849BCE5079FB}.Release|x86.Build.0 = Release|Any CPU {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Debug|x64.ActiveCfg = Debug|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Debug|x64.Build.0 = Debug|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Debug|x86.ActiveCfg = Debug|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Debug|x86.Build.0 = Debug|Any CPU {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Release|Any CPU.Build.0 = Release|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Release|x64.ActiveCfg = Release|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Release|x64.Build.0 = Release|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Release|x86.ActiveCfg = Release|Any CPU - {814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}.Release|x86.Build.0 = Release|Any CPU {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Debug|x64.ActiveCfg = Debug|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Debug|x64.Build.0 = Debug|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Debug|x86.ActiveCfg = Debug|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Debug|x86.Build.0 = Debug|Any CPU {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|Any CPU.Build.0 = Release|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x64.ActiveCfg = Release|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x64.Build.0 = Release|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x86.ActiveCfg = Release|Any CPU - {2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x86.Build.0 = Release|Any CPU {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x64.ActiveCfg = Debug|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x64.Build.0 = Debug|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x86.ActiveCfg = Debug|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x86.Build.0 = Debug|Any CPU {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|Any CPU.Build.0 = Release|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.ActiveCfg = Release|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.Build.0 = Release|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.ActiveCfg = Release|Any CPU - {10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.Build.0 = Release|Any CPU {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x64.ActiveCfg = Debug|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x64.Build.0 = Debug|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x86.ActiveCfg = Debug|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Debug|x86.Build.0 = Debug|Any CPU {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|Any CPU.ActiveCfg = Release|Any CPU {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|Any CPU.Build.0 = Release|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x64.ActiveCfg = Release|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x64.Build.0 = Release|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x86.ActiveCfg = Release|Any CPU - {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -288,9 +156,6 @@ Global {10AD85DD-929D-49B8-BD43-45242C2644B7} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} {79C2B2CB-872A-4BA9-82DC-60F6DD77F940} = {19FE674A-AC94-4E7E-B24C-2285D1D04CDE} EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {26F0752B-06F7-44AD-BFEE-8F2E36B3AA27} - EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B3911209-2DBF-47F8-98F6-BBC0EDFE63DE} EndGlobalSection From a8c18efa6e80fd9fd9c3e81ea73e4635176fa246 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 21 Feb 2019 20:16:45 -0800 Subject: [PATCH 053/105] Build with .NET Core SDK 2.2.104 --- azure-pipelines/build.yml | 4 ++-- global.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 30a4af7f8..088fa5c3b 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -1,9 +1,9 @@ steps: - task: DotNetCoreInstaller@0 - displayName: Install .NET Core SDK 2.1.500 + displayName: Install .NET Core SDK 2.2.104 inputs: packageType: sdk - version: 2.1.500 + version: 2.2.104 - script: dotnet --info displayName: Show dotnet SDK info diff --git a/global.json b/global.json index bba910871..ff860dc32 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { // Get the pinned version of the SDK from https://dotnet.microsoft.com/download/dotnet-core/2.1 - "version": "2.1.500" + "version": "2.2.104" } } From ae4e0bf9a75f61ad6d2efbe6da7c79b75b8740e9 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 21 Feb 2019 20:17:02 -0800 Subject: [PATCH 054/105] Ignore BenchmarkDotNet results --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 16768f8f6..42b1d6ceb 100644 --- a/.gitignore +++ b/.gitignore @@ -284,3 +284,6 @@ nuget/unity* !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json + +# BenchmarkDotNet results +BenchmarkDotNet.Artifacts/ From 85ba0515f1d16518aa288ae3a2e8b2f333773638 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 21 Feb 2019 20:30:28 -0800 Subject: [PATCH 055/105] Enable PerfNetFramework on .NET Core --- sandbox/PerfNetFramework/PerfNetFramework.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sandbox/PerfNetFramework/PerfNetFramework.csproj b/sandbox/PerfNetFramework/PerfNetFramework.csproj index 7991042e7..cade60417 100644 --- a/sandbox/PerfNetFramework/PerfNetFramework.csproj +++ b/sandbox/PerfNetFramework/PerfNetFramework.csproj @@ -1,7 +1,7 @@  Exe - net461 + net461;netcoreapp2.1 true From 951ab0e605bc7262a90b38b02d6eec44fda2f050 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 25 Feb 2019 11:47:01 -0600 Subject: [PATCH 056/105] Remove launchSettings.json This had machine-specific paths so it shouldn't be in source control. --- .../Properties/launchSettings.json | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json diff --git a/src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json b/src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json deleted file mode 100644 index f879103ca..000000000 --- a/src/MessagePack.UniversalCodeGenerator/Properties/launchSettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "profiles": { - "MessagePack.UniversalCodeGenerator": { - "commandName": "Project", - "commandLineArgs": "-i .\\sandbox\\shareddata\\shareddata.csproj -o .\\sandbox\\Sandbox\\Generated.cs", - "workingDirectory": "D:\\git\\MessagePack-CSharp" - } - } -} \ No newline at end of file From 9081261ad7ff082117ba5b351b3339e40ea8905b Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 25 Feb 2019 11:52:26 -0600 Subject: [PATCH 057/105] Fix typo in method name --- src/MessagePack/Resolvers/DynamicObjectResolver.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index cca2f1d6c..d9db8d026 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -417,7 +417,7 @@ public static object BuildFormatterToDynamicMethod(Type type, bool forceStringKe } foreach (var item in serializationInfo.Members.Where(x => x.IsReadable)) { - var attr = item.GetMessagePackFormatterAttribtue(); + var attr = item.GetMessagePackFormatterAttribute(); if (attr != null) { var formatter = Activator.CreateInstance(attr.FormatterType, attr.Arguments); @@ -430,7 +430,7 @@ public static object BuildFormatterToDynamicMethod(Type type, bool forceStringKe } foreach (var item in serializationInfo.Members) // not only for writable because for use ctor. { - var attr = item.GetMessagePackFormatterAttribtue(); + var attr = item.GetMessagePackFormatterAttribute(); if (attr != null) { var formatter = Activator.CreateInstance(attr.FormatterType, attr.Arguments); @@ -520,7 +520,7 @@ static void BuildConstructor(Type type, ObjectSerializationInfo info, Constructo Dictionary dict = new Dictionary(); foreach (var item in info.Members.Where(x => x.IsReadable || x.IsWritable)) { - var attr = item.GetMessagePackFormatterAttribtue(); + var attr = item.GetMessagePackFormatterAttribute(); if (attr != null) { var f = builder.DefineField(item.Name + "_formatter", attr.FormatterType, FieldAttributes.Private | FieldAttributes.InitOnly); @@ -1759,7 +1759,7 @@ public bool IsValueType } } - public MessagePackFormatterAttribute GetMessagePackFormatterAttribtue() + public MessagePackFormatterAttribute GetMessagePackFormatterAttribute() { if (IsProperty) { @@ -1844,4 +1844,4 @@ public MessagePackDynamicObjectResolverException(string message) } #endif -#endif \ No newline at end of file +#endif From 006a42399788296a22372483061de0d22fb35464 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 25 Feb 2019 11:53:51 -0600 Subject: [PATCH 058/105] Comment typo fixes --- src/MessagePack/Resolvers/TypelessObjectResolver.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MessagePack/Resolvers/TypelessObjectResolver.cs b/src/MessagePack/Resolvers/TypelessObjectResolver.cs index aadf73aac..a52838442 100644 --- a/src/MessagePack/Resolvers/TypelessObjectResolver.cs +++ b/src/MessagePack/Resolvers/TypelessObjectResolver.cs @@ -81,8 +81,8 @@ static class Helper {typeof(UInt64), ForceUInt64BlockFormatter.Instance}, {typeof(byte), ForceByteBlockFormatter.Instance}, {typeof(sbyte), ForceSByteBlockFormatter.Instance}, - - // Nulllable Primitive + + // Nullable Primitive {typeof(Nullable), NullableForceInt16BlockFormatter.Instance}, {typeof(Nullable), NullableForceInt32BlockFormatter.Instance}, {typeof(Nullable), NullableForceInt64BlockFormatter.Instance}, @@ -91,8 +91,8 @@ static class Helper {typeof(Nullable), NullableForceUInt64BlockFormatter.Instance}, {typeof(Nullable), NullableForceByteBlockFormatter.Instance}, {typeof(Nullable), NullableForceSByteBlockFormatter.Instance}, - - // otpmitized primitive array formatter + + // optimized primitive array formatter {typeof(Int16[]), ForceInt16BlockArrayFormatter.Instance}, {typeof(Int32[]), ForceInt32BlockArrayFormatter.Instance}, {typeof(Int64[]), ForceInt64BlockArrayFormatter.Instance}, @@ -145,4 +145,4 @@ static FormatterCache() } #endif -} \ No newline at end of file +} From 3fddf3869bee891ca1dd6e24bc343060d7a1c0ee Mon Sep 17 00:00:00 2001 From: itn3000 Date: Thu, 21 Feb 2019 15:22:26 +0900 Subject: [PATCH 059/105] replacing Buildalyzer to MSBuild.StructuredLogger for Unity project(#386) --- sandbox/TestData.InvalidProject/Class1.cs | 35 +++ .../TestData.InvalidProject.csproj | 12 + sandbox/TestData.InvalidSyntax/Class1.cs | 37 +++ .../TestData.InvalidSyntax.csproj | 10 + .../CodeAnalysis/TypeCollector.cs | 5 + .../MessagePack.UniversalCodeGenerator.csproj | 38 +-- .../Utils/RoslynExtensions.cs | 227 +++++++++++++----- 7 files changed, 266 insertions(+), 98 deletions(-) create mode 100644 sandbox/TestData.InvalidProject/Class1.cs create mode 100644 sandbox/TestData.InvalidProject/TestData.InvalidProject.csproj create mode 100644 sandbox/TestData.InvalidSyntax/Class1.cs create mode 100644 sandbox/TestData.InvalidSyntax/TestData.InvalidSyntax.csproj diff --git a/sandbox/TestData.InvalidProject/Class1.cs b/sandbox/TestData.InvalidProject/Class1.cs new file mode 100644 index 000000000..ac037a4cd --- /dev/null +++ b/sandbox/TestData.InvalidProject/Class1.cs @@ -0,0 +1,35 @@ +using MessagePack; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestData2 +{ + [MessagePackObject(true)] + public class A { public int a; public List bs; public C c; } + + [MessagePackObject(true)] + public class B { public List ass; public C c; public int a; } + + [MessagePackObject(true)] + public class C { public B b; public int a; } + + + [MessagePackObject(true)] + public class PropNameCheck1 + { + public string MyProperty1 { get; set; } + public virtual string MyProperty2 { get; set; } + } + + [MessagePackObject(true)] + public class PropNameCheck2 : PropNameCheck1 + { + public override string MyProperty2 + { + get => base.MyProperty2; + set => base.MyProperty2 = value; } + } +} diff --git a/sandbox/TestData.InvalidProject/TestData.InvalidProject.csproj b/sandbox/TestData.InvalidProject/TestData.InvalidProject.csproj new file mode 100644 index 000000000..3743f78a0 --- /dev/null +++ b/sandbox/TestData.InvalidProject/TestData.InvalidProject.csproj @@ -0,0 +1,12 @@ + + + net461 + + + + + + + + + diff --git a/sandbox/TestData.InvalidSyntax/Class1.cs b/sandbox/TestData.InvalidSyntax/Class1.cs new file mode 100644 index 000000000..63aa71256 --- /dev/null +++ b/sandbox/TestData.InvalidSyntax/Class1.cs @@ -0,0 +1,37 @@ +using MessagePack; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestData.InvalidSyntax +{ + // delibrated syntax error + abcde + [MessagePackObject(true)] + public class A { public int a; public List bs; public C c; } + + [MessagePackObject(true)] + public class B { public List ass; public C c; public int a; } + + [MessagePackObject(true)] + public class C { public B b; public int a; } + + + [MessagePackObject(true)] + public class PropNameCheck1 + { + public string MyProperty1 { get; set; } + public virtual string MyProperty2 { get; set; } + } + + [MessagePackObject(true)] + public class PropNameCheck2 : PropNameCheck1 + { + public override string MyProperty2 + { + get => base.MyProperty2; + set => base.MyProperty2 = value; } + } +} diff --git a/sandbox/TestData.InvalidSyntax/TestData.InvalidSyntax.csproj b/sandbox/TestData.InvalidSyntax/TestData.InvalidSyntax.csproj new file mode 100644 index 000000000..d992280d8 --- /dev/null +++ b/sandbox/TestData.InvalidSyntax/TestData.InvalidSyntax.csproj @@ -0,0 +1,10 @@ + + + net461 + + + + + + + diff --git a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs index ee21819a8..ea610ff88 100644 --- a/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.UniversalCodeGenerator/CodeAnalysis/TypeCollector.cs @@ -242,6 +242,11 @@ public TypeCollector(string csProjPath, IEnumerable conditinalSymbols, b { this.csProjPath = csProjPath; var compilation = RoslynExtensions.GetCompilationFromProject(csProjPath, conditinalSymbols.Concat(new[] { CodegeneratorOnlyPreprocessorSymbol }).ToArray()).GetAwaiter().GetResult(); + var compilationErrors = compilation.GetDiagnostics().Where(x => x.Severity == DiagnosticSeverity.Error).ToArray(); + if(compilationErrors.Length != 0) + { + throw new InvalidOperationException($"detect compilation error:{string.Join("\n", compilationErrors.Select(x => x.ToString()))}"); + } this.typeReferences = new ReferenceSymbols(compilation); this.disallowInternal = disallowInternal; this.isForceUseMap = isForceUseMap; diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj index a9af7f78e..f48305ec8 100644 --- a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj @@ -9,48 +9,22 @@ - + + - + True True - EnumTemplate.tt - - - True - True - FormatterTemplate.tt - - - True - True - ResolverTemplate.tt - - - True - True - UnionTemplate.tt + %(FileName).tt - - TextTemplatingFilePreprocessor - EnumTemplate.cs - - - TextTemplatingFilePreprocessor - FormatterTemplate.cs - - - TextTemplatingFilePreprocessor - ResolverTemplate.cs - - + TextTemplatingFilePreprocessor - UnionTemplate.cs + %(FileName).cs diff --git a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs index 3274f983c..a257ae04d 100644 --- a/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs +++ b/src/MessagePack.UniversalCodeGenerator/Utils/RoslynExtensions.cs @@ -1,8 +1,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Buildalyzer; -using Buildalyzer.Workspaces; +using Microsoft.CodeAnalysis.CSharp.Formatting; +using Microsoft.CodeAnalysis.Text; using System; using System.Collections.Generic; using System.IO; @@ -10,7 +10,8 @@ using System.Text; using System.Threading.Tasks; using System.Xml.Linq; -using Buildalyzer.Environment; + +using StLogger = Microsoft.Build.Logging.StructuredLogger; namespace MessagePack.CodeGenerator { @@ -20,18 +21,16 @@ internal static class RoslynExtensions static (string fname, string args) GetBuildCommandLine(string csprojPath, string tempPath, bool useDotNet) { string fname = "dotnet"; - const string tasks = "ResolveAssemblyReferencesDesignTime;ResolveProjectReferencesDesignTime;ResolveComReferencesDesignTime;Compile"; + const string tasks = "Restore;ResolveReferences"; // from Buildalyzer implementation // https://github.com/daveaglick/Buildalyzer/blob/b42d2e3ba1b3673a8133fb41e72b507b01bce1d6/src/Buildalyzer/Environment/BuildEnvironment.cs#L86-L96 Dictionary properties = new Dictionary() { - // trailing '\' may cause unexpected escape - {"IntermediateOutputPath", tempPath + "/"}, {"ProviderCommandLineArgs", "true"}, {"GenerateResourceMSBuildArchitecture", "CurrentArchitecture"}, {"DesignTimeBuild", "true"}, {"BuildProjectReferences","false"}, - {"SkipCompilerExecution","true"}, + // {"SkipCompilerExecution","true"}, {"DisableRarCache", "true"}, {"AutoGenerateBindingRedirects", "false"}, {"CopyBuildOutputToOutputDirectory", "false"}, @@ -62,15 +61,20 @@ static async Task TryExecute(string csprojPath, string tempPath, bool useD var (fname, args) = GetBuildCommandLine(csprojPath, tempPath, useDotNet); try { + var buildlogpath = Path.Combine(tempPath, "build.binlog"); + if (File.Exists(buildlogpath)) + { + try + { + File.Delete(buildlogpath); + } + catch { } + } using (var stdout = new MemoryStream()) using (var stderr = new MemoryStream()) { var exitCode = await ProcessUtil.ExecuteProcessAsync(fname, args, stdout, stderr, null).ConfigureAwait(false); - if (exitCode == 0) - { - return true; - } - else + if (exitCode != 0) { // write process output to stdout and stderr when error. using (var stdout2 = new MemoryStream(stdout.ToArray())) @@ -81,8 +85,8 @@ static async Task TryExecute(string csprojPath, string tempPath, bool useD await stdout2.CopyToAsync(consoleStdout).ConfigureAwait(false); await stderr2.CopyToAsync(consoleStderr).ConfigureAwait(false); } - return false; } + return File.Exists(buildlogpath); } } catch (Exception e) @@ -91,21 +95,72 @@ static async Task TryExecute(string csprojPath, string tempPath, bool useD return false; } } - static async Task GetAnalyzerResults(AnalyzerManager analyzerManager, string csprojPath, params string[] preprocessorSymbols) + static IEnumerable FindAllErrors(StLogger.Build build) + { + var lst = new List(); + build.VisitAllChildren(er => lst.Add(er)); + return lst; + } + static (StLogger.Build, IEnumerable) ProcessBuildLog(string tempPath) + { + var reader = new StLogger.BinLogReader(); + var stlogger = new StLogger.StructuredLogger(); + // prevent output temporary file + StLogger.StructuredLogger.SaveLogToDisk = false; + // never output, but if not set, throw exception when initializing + stlogger.Parameters = "tmp.buildlog"; + stlogger.Initialize(reader); + reader.Replay(Path.Combine(tempPath, "build.binlog")); + stlogger.Shutdown(); + var buildlog = stlogger.Construction.Build; + if (buildlog.Succeeded) + { + return (buildlog, null); + } + else + { + var errors = FindAllErrors(buildlog); + return (null, errors); + } + } + static async Task<(StLogger.Build, IEnumerable)> TryGetBuildResultAsync(string csprojPath, string tempPath, bool useDotNet, params string[] preprocessorSymbols) + { + try + { + if (!await TryExecute(csprojPath, tempPath, useDotNet).ConfigureAwait(false)) + { + return (null, Array.Empty()); + } + else + { + return ProcessBuildLog(tempPath); + } + } + finally + { + if (Directory.Exists(tempPath)) + { + Directory.Delete(tempPath, true); + } + } + } + static async Task GetBuildResult(string csprojPath, params string[] preprocessorSymbols) { var tempPath = Path.Combine(new FileInfo(csprojPath).Directory.FullName, "__buildtemp"); try { - if (!await TryExecute(csprojPath, tempPath, true).ConfigureAwait(false)) + (StLogger.Build build, IEnumerable errors) = await TryGetBuildResultAsync(csprojPath, tempPath, true, preprocessorSymbols).ConfigureAwait(false); + if (build == null) { Console.WriteLine("execute `dotnet msbuild` failed, retry with `msbuild`"); - if (!await TryExecute(csprojPath, tempPath, false).ConfigureAwait(false)) + var dotnetException = new InvalidOperationException($"failed to build project with dotnet:{string.Join("\n", errors)}"); + (build, errors) = await TryGetBuildResultAsync(csprojPath, tempPath, false, preprocessorSymbols).ConfigureAwait(false); + if (build == null) { - throw new Exception("failed to build project"); + throw new InvalidOperationException($"failed to build project: {string.Join("\n", errors)}"); } } - // get results of analysis from binarylog - return analyzerManager.Analyze(Path.Combine(tempPath, "build.binlog")).ToArray(); + return build; } finally { @@ -115,64 +170,104 @@ static async Task GetAnalyzerResults(AnalyzerManager analyzerM } } } - public static async Task GetCompilationFromProject(string csprojPath, params string[] preprocessorSymbols) + static Workspace GetWorkspaceFromBuild(this StLogger.Build build, params string[] preprocessorSymbols) { - var analyzerOptions = new AnalyzerManagerOptions(); - // analyzerOptions.LogWriter = Console.Out; - - var manager = new AnalyzerManager(); - var projectAnalyzer = manager.GetProject(csprojPath); // addproj - // projectAnalyzer.AddBuildLogger(new Microsoft.Build.Logging.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Minimal)); - - var workspace = await manager.GetWorkspaceWithPreventBuildEventAsync().ConfigureAwait(false); - - workspace.WorkspaceFailed += WorkSpaceFailed; - var project = workspace.CurrentSolution.Projects.First(); - project = project - .WithParseOptions((project.ParseOptions as CSharpParseOptions).WithPreprocessorSymbols(preprocessorSymbols)) - .WithCompilationOptions((project.CompilationOptions as CSharpCompilationOptions).WithAllowUnsafe(true)); - - var compilation = await project.GetCompilationAsync().ConfigureAwait(false); - return compilation; - } - - private static void WorkSpaceFailed(object sender, WorkspaceDiagnosticEventArgs e) - { - Console.WriteLine(e); - } - - // WIP function for getting Roslyn's workspace from csproj - public static async Task GetWorkspaceWithPreventBuildEventAsync(this AnalyzerManager manager) - { - var projPath = manager.Projects.First().Value.ProjectFile.Path; - var ws = new AdhocWorkspace(); - foreach (var result in await GetAnalyzerResults(manager, projPath)) + var csproj = build.Children.OfType().FirstOrDefault(); + if (csproj == null) + { + throw new InvalidOperationException("cannot find cs project build"); + } + StLogger.Item[] compileItems = Array.Empty(); + var properties = new Dictionary(); + foreach (var folder in csproj.Children.OfType()) { - // getting only successful build - if (result.Succeeded) + if (folder.Name == "Items") { - result.AddToWorkspace(ws); + var compileFolder = folder.Children.OfType().FirstOrDefault(x => x.Name == "Compile"); + if (compileFolder == null) + { + throw new InvalidOperationException("failed to get compililation documents"); + } + compileItems = compileFolder.Children.OfType().ToArray(); + } + else if (folder.Name == "Properties") + { + properties = folder.Children.OfType().ToDictionary(x => x.Name); } } + var assemblies = Array.Empty(); + foreach (var target in csproj.Children.OfType()) + { + if (target.Name == "ResolveReferences") + { + var folder = target.Children.OfType().Where(x => x.Name == "TargetOutputs").FirstOrDefault(); + if (folder == null) + { + throw new InvalidOperationException("cannot find result of resolving assembly"); + } + assemblies = folder.Children.OfType().ToArray(); + } + } + var ws = new AdhocWorkspace(); + var roslynProject = ws.AddProject(Path.GetFileNameWithoutExtension(csproj.ProjectFile), Microsoft.CodeAnalysis.LanguageNames.CSharp); + var projectDir = properties["ProjectDir"].Value; + var pguid = properties.ContainsKey("ProjectGuid") ? Guid.Parse(properties["ProjectGuid"].Value) : Guid.NewGuid(); + var projectGuid = ProjectId.CreateFromSerialized(pguid); + foreach (var compile in compileItems) + { + var filePath = compile.Text; + var absFilePath = Path.Combine(projectDir, filePath); + roslynProject = roslynProject.AddDocument(filePath, File.ReadAllText(absFilePath)).Project; + } + foreach (var asm in assemblies) + { + roslynProject = roslynProject.AddMetadataReference(MetadataReference.CreateFromFile(asm.Text)); + } + var compopt = roslynProject.CompilationOptions as CSharpCompilationOptions; + compopt = roslynProject.CompilationOptions as CSharpCompilationOptions; + compopt = compopt ?? new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); + OutputKind kind; + switch (properties["OutputType"].Value) + { + case "Exe": + kind = OutputKind.ConsoleApplication; + break; + case "Library": + kind = OutputKind.DynamicallyLinkedLibrary; + break; + default: + kind = OutputKind.DynamicallyLinkedLibrary; + break; + } + roslynProject = roslynProject.WithCompilationOptions(compopt.WithOutputKind(kind).WithAllowUnsafe(true)); + var parseopt = roslynProject.ParseOptions as CSharpParseOptions; + roslynProject = roslynProject.WithParseOptions(parseopt.WithPreprocessorSymbols(preprocessorSymbols)); + if (!ws.TryApplyChanges(roslynProject.Solution)) + { + throw new InvalidOperationException("failed to apply solution changes to workspace"); + } return ws; } - - public static AdhocWorkspace GetWorkspace(this AnalyzerManager manager, EnvironmentOptions envOptions) + public static async Task GetCompilationFromProject(string csprojPath, params string[] preprocessorSymbols) { - // Run builds in parallel - List results = manager.Projects.Values - .AsParallel() - .Select(p => p.Build(envOptions).FirstOrDefault()) // with envoption - .Where(x => x != null) - .ToList(); + var build = await GetBuildResult(csprojPath, preprocessorSymbols).ConfigureAwait(false); - // Add each result to a new workspace - AdhocWorkspace workspace = new AdhocWorkspace(); - foreach (AnalyzerResult result in results) + using (var workspace = GetWorkspaceFromBuild(build, preprocessorSymbols)) { - result.AddToWorkspace(workspace); + workspace.WorkspaceFailed += WorkSpaceFailed; + var project = workspace.CurrentSolution.Projects.First(); + project = project + .WithParseOptions((project.ParseOptions as CSharpParseOptions).WithPreprocessorSymbols(preprocessorSymbols)) + .WithCompilationOptions((project.CompilationOptions as CSharpCompilationOptions).WithAllowUnsafe(true)); + + var compilation = await project.GetCompilationAsync().ConfigureAwait(false); + return compilation; } - return workspace; + } + + private static void WorkSpaceFailed(object sender, WorkspaceDiagnosticEventArgs e) + { + Console.WriteLine(e); } public static IEnumerable GetNamedTypeSymbols(this Compilation compilation) From 7c503b4a61ec2b8fddb77a36df2566a39ebb96a7 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Sun, 10 Mar 2019 22:11:55 +0900 Subject: [PATCH 060/105] Add SerializerBenchmark project --- MessagePack.sln | 20 +- .../SerializerBenchmark/BenchmarkConfig.cs | 68 ++ .../SerializerBenchmark/ExtensionMethods.cs | 142 +++ .../Fixture/BooleanValueFixture.cs | 15 + .../Fixture/ByteValueFixture.cs | 15 + .../Fixture/DateTimeOffsetValueFixture.cs | 16 + .../Fixture/DateTimeValueFixture.cs | 18 + .../Fixture/DecimalValueFixture.cs | 15 + .../Fixture/DoubleValueFixture.cs | 15 + .../Fixture/EnumValueFixture.cs | 23 + .../Fixture/ExpressionTreeFixture.cs | 243 +++++ .../Fixture/FloatValueFixture.cs | 15 + .../Fixture/GuidValueFixture.cs | 14 + .../Fixture/IValueFixture.cs | 10 + .../Fixture/IntValueFixture.cs | 15 + .../Fixture/LongValueFixture.cs | 15 + .../Fixture/OtherPrimitiveFixtures.cs | 65 ++ .../Fixture/ShortValueFixture.cs | 15 + .../Fixture/StringValueFixture.cs | 27 + .../SerializerBenchmark/IGenericEquality.cs | 8 + .../MessagePack_1_7_3_6.dll | Bin 0 -> 283136 bytes .../SerializerBenchmark/Models/AccessToken.cs | 43 + .../Models/AccountMerge.cs | 36 + .../SerializerBenchmark/Models/Answer.cs | 142 +++ benchmark/SerializerBenchmark/Models/Badge.cs | 73 ++ .../SerializerBenchmark/Models/Comment.cs | 88 ++ benchmark/SerializerBenchmark/Models/Error.cs | 35 + benchmark/SerializerBenchmark/Models/Event.cs | 55 + benchmark/SerializerBenchmark/Models/Feed.cs | 688 +++++++++++++ .../SerializerBenchmark/Models/FlagOption.cs | 66 ++ .../SerializerBenchmark/Models/InboxItem.cs | 83 ++ benchmark/SerializerBenchmark/Models/Info.cs | 272 +++++ .../SerializerBenchmark/Models/NetworkUser.cs | 76 ++ .../Models/Notification.cs | 68 ++ benchmark/SerializerBenchmark/Models/Post.cs | 112 ++ .../SerializerBenchmark/Models/Privilege.cs | 35 + .../SerializerBenchmark/Models/Question.cs | 359 +++++++ .../Models/QuestionTimeline.cs | 83 ++ .../SerializerBenchmark/Models/Reputation.cs | 72 ++ .../Models/ReputationHistory.cs | 83 ++ .../SerializerBenchmark/Models/Revision.cs | 108 ++ .../Models/SearchExcerpt.cs | 119 +++ .../SerializerBenchmark/Models/ShallowUser.cs | 68 ++ .../Models/SuggestedEdit.cs | 78 ++ benchmark/SerializerBenchmark/Models/Tag.cs | 62 ++ .../SerializerBenchmark/Models/TagScore.cs | 35 + .../SerializerBenchmark/Models/TagSynonym.cs | 46 + .../SerializerBenchmark/Models/TagWiki.cs | 58 ++ .../SerializerBenchmark/Models/TopTag.cs | 50 + benchmark/SerializerBenchmark/Models/User.cs | 190 ++++ .../Models/UserTimeline.cs | 88 ++ .../Models/WritePermission.cs | 55 + benchmark/SerializerBenchmark/Program.cs | 13 + .../SerializerBenchmark.cs | 953 ++++++++++++++++++ .../SerializerBenchmark.csproj | 45 + .../Serializers/BinaryFormatter.cs | 24 + .../Serializers/DataContractSerializer.cs | 24 + .../Serializers/FsPicklerSerializer.cs | 26 + .../Serializers/HyperionSerializer.cs | 26 + .../Serializers/JilSerializer.cs | 16 + .../Serializers/JsonNetSerializer.cs | 33 + .../Serializers/MessagePackSerializer.cs | 56 + .../Serializers/MsgPackCliSerializer.cs | 14 + .../Serializers/ProtobufSerializer.cs | 23 + .../Serializers/SerializerBase.cs | 13 + .../Serializers/SpanJsonSerializer.cs | 14 + .../Serializers/Utf8JsonSerializer.cs | 14 + src/MessagePack/MessagePack.csproj | 7 + 68 files changed, 5498 insertions(+), 3 deletions(-) create mode 100644 benchmark/SerializerBenchmark/BenchmarkConfig.cs create mode 100644 benchmark/SerializerBenchmark/ExtensionMethods.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/BooleanValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/ByteValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/DateTimeOffsetValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/DateTimeValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/DecimalValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/DoubleValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/EnumValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/ExpressionTreeFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/FloatValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/GuidValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/IValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/IntValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/LongValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/OtherPrimitiveFixtures.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/ShortValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/Fixture/StringValueFixture.cs create mode 100644 benchmark/SerializerBenchmark/IGenericEquality.cs create mode 100644 benchmark/SerializerBenchmark/MessagePack_1_7_3_6.dll create mode 100644 benchmark/SerializerBenchmark/Models/AccessToken.cs create mode 100644 benchmark/SerializerBenchmark/Models/AccountMerge.cs create mode 100644 benchmark/SerializerBenchmark/Models/Answer.cs create mode 100644 benchmark/SerializerBenchmark/Models/Badge.cs create mode 100644 benchmark/SerializerBenchmark/Models/Comment.cs create mode 100644 benchmark/SerializerBenchmark/Models/Error.cs create mode 100644 benchmark/SerializerBenchmark/Models/Event.cs create mode 100644 benchmark/SerializerBenchmark/Models/Feed.cs create mode 100644 benchmark/SerializerBenchmark/Models/FlagOption.cs create mode 100644 benchmark/SerializerBenchmark/Models/InboxItem.cs create mode 100644 benchmark/SerializerBenchmark/Models/Info.cs create mode 100644 benchmark/SerializerBenchmark/Models/NetworkUser.cs create mode 100644 benchmark/SerializerBenchmark/Models/Notification.cs create mode 100644 benchmark/SerializerBenchmark/Models/Post.cs create mode 100644 benchmark/SerializerBenchmark/Models/Privilege.cs create mode 100644 benchmark/SerializerBenchmark/Models/Question.cs create mode 100644 benchmark/SerializerBenchmark/Models/QuestionTimeline.cs create mode 100644 benchmark/SerializerBenchmark/Models/Reputation.cs create mode 100644 benchmark/SerializerBenchmark/Models/ReputationHistory.cs create mode 100644 benchmark/SerializerBenchmark/Models/Revision.cs create mode 100644 benchmark/SerializerBenchmark/Models/SearchExcerpt.cs create mode 100644 benchmark/SerializerBenchmark/Models/ShallowUser.cs create mode 100644 benchmark/SerializerBenchmark/Models/SuggestedEdit.cs create mode 100644 benchmark/SerializerBenchmark/Models/Tag.cs create mode 100644 benchmark/SerializerBenchmark/Models/TagScore.cs create mode 100644 benchmark/SerializerBenchmark/Models/TagSynonym.cs create mode 100644 benchmark/SerializerBenchmark/Models/TagWiki.cs create mode 100644 benchmark/SerializerBenchmark/Models/TopTag.cs create mode 100644 benchmark/SerializerBenchmark/Models/User.cs create mode 100644 benchmark/SerializerBenchmark/Models/UserTimeline.cs create mode 100644 benchmark/SerializerBenchmark/Models/WritePermission.cs create mode 100644 benchmark/SerializerBenchmark/Program.cs create mode 100644 benchmark/SerializerBenchmark/SerializerBenchmark.cs create mode 100644 benchmark/SerializerBenchmark/SerializerBenchmark.csproj create mode 100644 benchmark/SerializerBenchmark/Serializers/BinaryFormatter.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/DataContractSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/FsPicklerSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/HyperionSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/JilSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/JsonNetSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/MsgPackCliSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/SerializerBase.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/SpanJsonSerializer.cs create mode 100644 benchmark/SerializerBenchmark/Serializers/Utf8JsonSerializer.cs diff --git a/MessagePack.sln b/MessagePack.sln index 96b975619..e5e81d65f 100644 --- a/MessagePack.sln +++ b/MessagePack.sln @@ -64,6 +64,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .gitignore = .gitignore EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmark", "benchmark", "{51A614B0-E583-4DD2-AC7D-6A65634582E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SerializerBenchmark", "benchmark\SerializerBenchmark\SerializerBenchmark.csproj", "{4142EA80-FEF4-44A5-8553-1AE84BEBAFED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -266,6 +270,18 @@ Global {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x64.Build.0 = Release|Any CPU {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x86.ActiveCfg = Release|Any CPU {79C2B2CB-872A-4BA9-82DC-60F6DD77F940}.Release|x86.Build.0 = Release|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Debug|x64.ActiveCfg = Debug|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Debug|x64.Build.0 = Debug|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Debug|x86.ActiveCfg = Debug|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Debug|x86.Build.0 = Debug|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Release|Any CPU.Build.0 = Release|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Release|x64.ActiveCfg = Release|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Release|x64.Build.0 = Release|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Release|x86.ActiveCfg = Release|Any CPU + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -287,9 +303,7 @@ Global {2A32A538-BA26-4D89-85D0-E4249AFA0837} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700} {10AD85DD-929D-49B8-BD43-45242C2644B7} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC} {79C2B2CB-872A-4BA9-82DC-60F6DD77F940} = {19FE674A-AC94-4E7E-B24C-2285D1D04CDE} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {26F0752B-06F7-44AD-BFEE-8F2E36B3AA27} + {4142EA80-FEF4-44A5-8553-1AE84BEBAFED} = {51A614B0-E583-4DD2-AC7D-6A65634582E0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B3911209-2DBF-47F8-98F6-BBC0EDFE63DE} diff --git a/benchmark/SerializerBenchmark/BenchmarkConfig.cs b/benchmark/SerializerBenchmark/BenchmarkConfig.cs new file mode 100644 index 000000000..4e72a9853 --- /dev/null +++ b/benchmark/SerializerBenchmark/BenchmarkConfig.cs @@ -0,0 +1,68 @@ +using Benchmark.Serializers; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Environments; +using BenchmarkDotNet.Exporters; +using BenchmarkDotNet.Exporters.Csv; +using BenchmarkDotNet.Jobs; +using BenchmarkDotNet.Order; +using BenchmarkDotNet.Reports; +using BenchmarkDotNet.Running; +using System.Collections.Generic; +using System.Linq; + +namespace Benchmark +{ + public class BenchmarkConfig : ManualConfig + { + public BenchmarkConfig() + { + // run quickly:) + var baseConfig = Job.ShortRun.WithIterationCount(1).WithWarmupCount(1); + + // Add(baseConfig.With(Runtime.Clr).With(Jit.RyuJit).With(Platform.X64)); + Add(baseConfig.With(Runtime.Core).With(Jit.RyuJit).With(Platform.X64)); + + Add(MarkdownExporter.GitHub); + Add(CsvExporter.Default); + Add(MemoryDiagnoser.Default); + + this.Set(new CustomOrderer()); + } + + // 0.11.4 has bug of set CustomOrderer https://github.com/dotnet/BenchmarkDotNet/issues/1070 + // so skip update to 0.11.4. + + public class CustomOrderer : IOrderer + { + public bool SeparateLogicalGroups => false; + + public IEnumerable GetExecutionOrder(BenchmarkCase[] benchmarksCase) + { + return benchmarksCase; + } + + public string GetHighlightGroupKey(BenchmarkCase benchmarkCase) + { + return benchmarkCase.Descriptor.MethodIndex.ToString(); + } + + public string GetLogicalGroupKey(IConfig config, BenchmarkCase[] allBenchmarksCases, BenchmarkCase benchmarkCase) + { + return null; + } + + public IEnumerable> GetLogicalGroupOrder(IEnumerable> logicalGroups) + { + return logicalGroups; + } + + public IEnumerable GetSummaryOrder(BenchmarkCase[] benchmarksCases, Summary summary) + { + return benchmarksCases + .OrderBy(x => x.Descriptor.WorkloadMethod.Name) + .ThenBy(x => x.Parameters.Items.Select(y => y.Value).OfType().First().GetType().Name); + } + } + } +} diff --git a/benchmark/SerializerBenchmark/ExtensionMethods.cs b/benchmark/SerializerBenchmark/ExtensionMethods.cs new file mode 100644 index 000000000..941c48dbe --- /dev/null +++ b/benchmark/SerializerBenchmark/ExtensionMethods.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Benchmark +{ + public class GenericEqualityComparer : IEqualityComparer where T : class, IGenericEquality + { + public static readonly GenericEqualityComparer Default = new GenericEqualityComparer(); + + public bool Equals(T x, T y) + { + return x.TrueEquals(y); + } + + public int GetHashCode(T obj) + { + return 0; // not fast, but not really important here + } + } + + public static class ExtensionMethods + { + public static bool TrueEqualsString(this IEnumerable a, IEnumerable b) + { + return a.SequenceEqual(b); + } + + public static bool TrueEqualsString(this string a, string b) + { + return a == b; + } + + public static bool TrueEquals(this T? a, T? b) + where T : struct + { + if (!a.HasValue && !b.HasValue) + { + return true; + } + if (!a.HasValue) + { + return false; + } + if (!b.HasValue) + { + return false; + } + + return a.Value.Equals(b.Value); + } + + public static bool TrueEquals(this T a, T b) + where T : class, IGenericEquality + { + if (ReferenceEquals(a, null) && ReferenceEquals(b, null)) + { + return true; + } + + if (ReferenceEquals(a, null)) + { + return false; + } + + if (ReferenceEquals(b, null)) + { + return false; + } + + return a.Equals(b); + } + + public static bool TrueEqualsList(this IEnumerable a, IEnumerable b) + where T : class, IGenericEquality + { + return a.SequenceEqual(b, GenericEqualityComparer.Default); + } + + public static bool TrueEqualsListDynamic(this IEnumerable a, IEnumerable b) + where T : class, IGenericEquality + { + if (ReferenceEquals(a, null) && ReferenceEquals(b, null)) + { + return true; + } + + if (ReferenceEquals(a, null)) + { + return false; + } + if (ReferenceEquals(b, null)) + { + return false; + } + + using (var e1 = a.GetEnumerator()) + using (var e2 = b.GetEnumerator()) + { + while (true) + { + var e1Next = e1.MoveNext(); + var e2Next = e2.MoveNext(); + if (e1Next != e2Next) + { + return false; + } + if (!e1Next && !e2Next) + { + break; + } + var c1 = e1.Current; + var c2 = e2.Current; + + if (c1 == null && c2 != null) + { + return false; + } + if (c2 == null && c1 != null) + { + return false; + } + if (!c1.EqualsDynamic(c2)) + { + return false; + } + } + } + + return true; + } + + public static bool IsTypedList(this Type type) + { + return + type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>) || + type.GetTypeInfo().GetInterfaces().Any(i => + i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>)); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/BooleanValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/BooleanValueFixture.cs new file mode 100644 index 000000000..bb600ce5c --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/BooleanValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class BooleanValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(bool); + + public object Generate() + { + return _prng.Next() % 2 == 1; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/ByteValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/ByteValueFixture.cs new file mode 100644 index 000000000..d08331791 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/ByteValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class ByteValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(byte); + + public object Generate() + { + return (byte) (_prng.Next() & 0xFF); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/DateTimeOffsetValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/DateTimeOffsetValueFixture.cs new file mode 100644 index 000000000..f7302c7a9 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/DateTimeOffsetValueFixture.cs @@ -0,0 +1,16 @@ +using System; + +namespace Benchmark.Fixture +{ + public class DateTimeOffsetValueFixture : IValueFixture + { + private long _lastValue; + public Type Type { get; } = typeof(DateTimeOffset); + + public object Generate() + { + _lastValue += 1000; + return DateTimeOffset.FromUnixTimeMilliseconds(_lastValue); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/DateTimeValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/DateTimeValueFixture.cs new file mode 100644 index 000000000..b64d57945 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/DateTimeValueFixture.cs @@ -0,0 +1,18 @@ +using System; + +namespace Benchmark.Fixture +{ + public class DateTimeValueFixture : IValueFixture + { + private long _lastValue; + private static readonly long Offset = new DateTime(1970, 1,1,0,0,0).ToFileTime(); + public Type Type { get; } = typeof(DateTime); + + public object Generate() + { + _lastValue += 1000; + var dt = DateTime.FromFileTime(_lastValue+Offset); + return dt; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/DecimalValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/DecimalValueFixture.cs new file mode 100644 index 000000000..5ab727ae0 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/DecimalValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class DecimalValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(decimal); + + public object Generate() + { + return _prng.Next() + 0.66m; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/DoubleValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/DoubleValueFixture.cs new file mode 100644 index 000000000..7eb0b1ad3 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/DoubleValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class DoubleValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(double); + + public object Generate() + { + return _prng.Next() + 0.5d; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/EnumValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/EnumValueFixture.cs new file mode 100644 index 000000000..cf944d422 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/EnumValueFixture.cs @@ -0,0 +1,23 @@ +using System; + +namespace Benchmark.Fixture +{ + public class EnumValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + private readonly string[] _values; + + public EnumValueFixture(Type type) + { + Type = type; + _values = Enum.GetNames(Type); + } + + public Type Type { get; } + + public object Generate() + { + return Enum.Parse(Type, _values[_prng.Next(_values.Length)]); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/ExpressionTreeFixture.cs b/benchmark/SerializerBenchmark/Fixture/ExpressionTreeFixture.cs new file mode 100644 index 000000000..bede1abc5 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/ExpressionTreeFixture.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace Benchmark.Fixture +{ + public class ExpressionTreeFixture + { + private readonly ConcurrentDictionary> _functorCache = + new ConcurrentDictionary>(); + + private readonly Dictionary _valueFixtures = new Dictionary(); + + public ExpressionTreeFixture() + { + IValueFixture[] fixtures = new IValueFixture[] + { + new StringValueFixture(), + new IntValueFixture(), + new GuidValueFixture(), + new DateTimeOffsetValueFixture(), + new DateTimeValueFixture(), + new BooleanValueFixture(), + new DecimalValueFixture(), + new LongValueFixture(), + new FloatValueFixture(), + new DoubleValueFixture(), + new ByteValueFixture(), + new ShortValueFixture(), + new ByteArrayFixture(), + new SByteValueFixture(), + new UShortValueFixture(), + new UInt32ValueFixture(), + new UInt64ValueFixture(), + new CharValueFixture() + }; + + foreach (var item in fixtures) + { + _valueFixtures.Add(item.Type, item); + } + } + + public object Create(Type type, int repeatCount = 1, int recursiveCount = 1) + { + var functor = _functorCache.GetOrAdd(type, AddFunctor); + return functor(repeatCount, recursiveCount); + } + + private Func AddFunctor(Type type) + { + var repeatCount = Expression.Parameter(typeof(int), "repeatCount"); + var recursiveCount = Expression.Parameter(typeof(int), "recursiveCount"); + var subExpressions = new List(); + var typedOutput = Expression.Variable(type, "typedOutput"); + if (_valueFixtures.ContainsKey(type) || type.IsArray || type.IsTypedList() + ) // they can be generated directly + { + var expression = GenerateValue(typedOutput, repeatCount, recursiveCount, type); + subExpressions.Add(expression); + } + else + { + subExpressions.Add(Expression.Assign(typedOutput, Expression.New(type))); + var typeProps = type.GetProperties(); + foreach (var propertyInfo in typeProps) + { + if (!propertyInfo.CanWrite) + { + continue; + } + var propertyType = propertyInfo.PropertyType; + var isRecursion = IsRecursion(type, propertyType) || IsRecursion(propertyType, type); + var memberAccess = Expression.MakeMemberAccess(typedOutput, propertyInfo); + var expression = GenerateValue(memberAccess, repeatCount, + isRecursion ? Expression.Decrement(recursiveCount) : (Expression)recursiveCount, propertyType); + subExpressions.Add(expression); + } + } + var returnTarget = Expression.Label(typeof(object)); + var returnLabel = Expression.Label(returnTarget, Expression.Convert(typedOutput, typeof(object))); + subExpressions.Add(returnLabel); + var block = Expression.Block(new[] { typedOutput }, subExpressions); + var lambda = Expression.Lambda>(block, repeatCount, recursiveCount); + return lambda.Compile(); + } + + private bool IsRecursion(Type parentType, Type type) + { + if (type == parentType) + { + return true; + } + if (parentType.IsTypedList()) + { + var childType = parentType.GetGenericArguments()[0]; + return IsRecursion(type, childType); + } + if (parentType.IsArray) + { + var elementType = parentType.GetElementType(); + return IsRecursion(type, elementType); + } + if (Nullable.GetUnderlyingType(parentType) != null) + { + var nullableType = Nullable.GetUnderlyingType(parentType); + return IsRecursion(type, nullableType); + } + return false; + } + + private Expression GenerateValue(Expression generatedValue, Expression repeatCount, Expression recursiveCount, + Type type) + { + var result = new List(); + if (_valueFixtures.TryGetValue(type, out var valueFixture)) + { + var generateMethodInfo = valueFixture.GetType().GetMethod(nameof(IValueFixture.Generate)); + result.Add(Expression.Assign(generatedValue, + Expression.Convert(Expression.Call(Expression.Constant(valueFixture), generateMethodInfo), + generatedValue.Type))); + } + else if (type.IsTypedList()) + { + var expressionList = new List(); + var elementType = type.GetGenericArguments()[0]; + expressionList.Add(Expression.Assign(generatedValue, Expression.New(type))); + var index = Expression.Parameter(typeof(int), "i"); + var addMi = type.GetMethod("Add", new[] { elementType }); + var childValue = Expression.Parameter(elementType); + var loopBlock = new List + { + GenerateValue(childValue, repeatCount, recursiveCount, elementType), + Expression.Call(generatedValue, addMi, childValue) + }; + if (loopBlock.Count > 0) + { + var loopContent = Expression.Block(new[] { childValue, index }, loopBlock); + expressionList.Add(ForLoop(index, repeatCount, loopContent)); + } + result.Add(MakeIfExpression(recursiveCount, expressionList)); + } + else if (type.IsArray) + { + var elementType = type.GetElementType(); + var index = Expression.Parameter(typeof(int), "i"); + var arrayList = new List + { + Expression.Assign(generatedValue, Expression.NewArrayBounds(elementType, repeatCount)), + ForLoop(index, repeatCount, + GenerateValue(Expression.ArrayAccess(generatedValue, index), repeatCount, recursiveCount, + elementType)) + }; + result.Add(MakeIfExpression(recursiveCount, arrayList)); + } + else if (Nullable.GetUnderlyingType(type) != null) + { + var elementType = Nullable.GetUnderlyingType(type); + result.Add(GenerateValue(generatedValue, repeatCount, recursiveCount, elementType)); + } + else if (type.GetTypeInfo().IsEnum) + { + if (!_valueFixtures.TryGetValue(type, out valueFixture)) + { + valueFixture = new EnumValueFixture(type); + _valueFixtures.Add(valueFixture.Type, valueFixture); + } + result.Add(GenerateValue(generatedValue, repeatCount, recursiveCount, + type)); // call again for main method + } + else + { + result.Add(MakeIfExpression(recursiveCount, + InvokeCreate(type, generatedValue, repeatCount, recursiveCount))); + } + return result.Count > 1 ? Expression.Block(result) : result.Single(); + } + + private Expression InvokeCreate(Type type, Expression generatedValue, Expression repeatCount, + Expression recursiveCount) + { + var mi = typeof(ExpressionTreeFixture).GetMethod(nameof(Create), + new[] { typeof(Type), typeof(int), typeof(int) }); + return Expression.Assign(generatedValue, + Expression.Convert( + Expression.Call(Expression.Constant(this), mi, + new[] { Expression.Constant(type), repeatCount, recursiveCount }), + generatedValue.Type)); + } + + private Expression MakeIfExpression(Expression recursiveCount, params Expression[] input) + { + return Expression.IfThen(Expression.GreaterThanOrEqual(recursiveCount, Expression.Constant(0)), + input.Length > 1 ? Expression.Block(input) : input.Single()); + } + + private Expression MakeIfExpression(Expression recursiveCount, IList input) + { + return Expression.IfThen(Expression.GreaterThanOrEqual(recursiveCount, Expression.Constant(0)), + input.Count > 1 ? Expression.Block(input) : input.Single()); + } + + public T Create(int repeatCount = 1, int recursiveCount = 1) + { + return (T)Create(typeof(T), repeatCount, recursiveCount); + } + + public IEnumerable CreateMany(int count, int repeatCount = 1, int recursiveCount = 1) + { + return CreateMany(typeof(T), count, repeatCount, recursiveCount).Cast(); + } + + public IEnumerable CreateMany(Type type, int count, int repeatCount = 1, int recursiveCount = 1) + { + var functor = _functorCache.GetOrAdd(type, AddFunctor); + for (var i = 0; i < count; i++) + { + yield return functor(repeatCount, recursiveCount); + } + } + + public static Expression ForLoop(ParameterExpression index, Expression lengthExpression, Expression loopContent) + { + var breakLabel = Expression.Label("LoopBreak"); + var length = Expression.Variable(typeof(int), "length"); + var block = Expression.Block(new[] { index, length }, + Expression.Assign(index, Expression.Constant(0)), + Expression.Assign(length, lengthExpression), + Expression.Loop( + Expression.IfThenElse( + Expression.LessThan(index, length), + Expression.Block(loopContent, Expression.PostIncrementAssign(index)), + Expression.Break(breakLabel) + ), + breakLabel) + ); + return block; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/FloatValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/FloatValueFixture.cs new file mode 100644 index 000000000..c4ff9df7a --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/FloatValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class FloatValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(float); + + public object Generate() + { + return (float) _prng.Next() % 10000 + 0.5f; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/GuidValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/GuidValueFixture.cs new file mode 100644 index 000000000..948e495ff --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/GuidValueFixture.cs @@ -0,0 +1,14 @@ +using System; + +namespace Benchmark.Fixture +{ + public class GuidValueFixture : IValueFixture + { + public Type Type { get; } = typeof(Guid); + + public object Generate() + { + return Guid.NewGuid(); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/IValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/IValueFixture.cs new file mode 100644 index 000000000..b5128ccce --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/IValueFixture.cs @@ -0,0 +1,10 @@ +using System; + +namespace Benchmark.Fixture +{ + public interface IValueFixture + { + Type Type { get; } + object Generate(); + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/IntValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/IntValueFixture.cs new file mode 100644 index 000000000..54a57f3da --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/IntValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class IntValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(int); + + public object Generate() + { + return _prng.Next(); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/LongValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/LongValueFixture.cs new file mode 100644 index 000000000..a0f0ebf4f --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/LongValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class LongValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(long); + + public object Generate() + { + return ((long) _prng.Next() << 32) | (uint) _prng.Next(); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/OtherPrimitiveFixtures.cs b/benchmark/SerializerBenchmark/Fixture/OtherPrimitiveFixtures.cs new file mode 100644 index 000000000..586b4614a --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/OtherPrimitiveFixtures.cs @@ -0,0 +1,65 @@ +using System; +using System.Runtime.CompilerServices; + +namespace Benchmark.Fixture +{ + public delegate T Converter(ReadOnlySpan buffer); + + public abstract class PrimitiveFixtureBase : IValueFixture + where T : unmanaged + { + private readonly Random rand = new Random(); + + public Type Type => typeof(T); + + public abstract object Generate(); + + protected unsafe object GenerateBytes(Converter converter) + { + Span buffer = stackalloc byte[sizeof(T)]; + rand.NextBytes(buffer); + return converter(buffer); + } + } + + public class SByteValueFixture : PrimitiveFixtureBase + { + public override object Generate() + { + return GenerateBytes(x => unchecked((sbyte)x[0])); + } + } + + public class UShortValueFixture : PrimitiveFixtureBase + { + public override object Generate() => GenerateBytes(BitConverter.ToUInt16); + } + + public class UInt32ValueFixture : PrimitiveFixtureBase + { + public override object Generate() => GenerateBytes(BitConverter.ToUInt32); + } + + public class UInt64ValueFixture : PrimitiveFixtureBase + { + public override object Generate() => GenerateBytes(BitConverter.ToUInt64); + } + + public class CharValueFixture : PrimitiveFixtureBase + { + public override object Generate() => GenerateBytes(BitConverter.ToChar); + } + + public class ByteArrayFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(byte[]); + + public object Generate() + { + var bytes = new byte[100]; + _prng.NextBytes(bytes); + return bytes; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/ShortValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/ShortValueFixture.cs new file mode 100644 index 000000000..fc75d0b5c --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/ShortValueFixture.cs @@ -0,0 +1,15 @@ +using System; + +namespace Benchmark.Fixture +{ + public class ShortValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + public Type Type { get; } = typeof(short); + + public object Generate() + { + return (short) (_prng.Next() & 0xFFFF); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Fixture/StringValueFixture.cs b/benchmark/SerializerBenchmark/Fixture/StringValueFixture.cs new file mode 100644 index 000000000..17a740149 --- /dev/null +++ b/benchmark/SerializerBenchmark/Fixture/StringValueFixture.cs @@ -0,0 +1,27 @@ +using System; + +namespace Benchmark.Fixture +{ + public class StringValueFixture : IValueFixture + { + private readonly Random _prng = new Random(); + + public Type Type { get; } = typeof(string); + + public object Generate() + { + return Generate(8); + } + + private string Generate(int length) + { + const string chars = "abcdefghijklmnopqrstuvwxyz0123456789"; + var cArray = new char[length]; + for (var i = 0; i < length; i++) + { + cArray[i] = chars[_prng.Next(chars.Length)]; + } + return new string(cArray); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/IGenericEquality.cs b/benchmark/SerializerBenchmark/IGenericEquality.cs new file mode 100644 index 000000000..ae24e6e06 --- /dev/null +++ b/benchmark/SerializerBenchmark/IGenericEquality.cs @@ -0,0 +1,8 @@ +namespace Benchmark +{ + public interface IGenericEquality + { + bool Equals(T obj); + bool EqualsDynamic(dynamic obj); + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/MessagePack_1_7_3_6.dll b/benchmark/SerializerBenchmark/MessagePack_1_7_3_6.dll new file mode 100644 index 0000000000000000000000000000000000000000..232ca15a5d3b1b7dc315d6b690d144e8612fc75a GIT binary patch literal 283136 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 + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string access_token { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public DateTime? expires_on_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? account_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public List scope { get; set; } + + public bool Equals(AccessToken obj) + { + return + access_token.TrueEqualsString(obj.access_token) || + expires_on_date.TrueEquals(obj.expires_on_date) || + account_id.TrueEquals(obj.account_id) || + scope.TrueEqualsString(obj.scope); + } + + public bool EqualsDynamic(dynamic obj) + { + return + access_token.TrueEqualsString((string)obj.access_token) || + expires_on_date.TrueEquals((DateTime?)obj.expires_on_date) || + account_id.TrueEquals((int?)obj.account_id) || + scope.TrueEqualsString((IEnumerable)obj.scope); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/AccountMerge.cs b/benchmark/SerializerBenchmark/Models/AccountMerge.cs new file mode 100644 index 000000000..32a4fcab5 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/AccountMerge.cs @@ -0,0 +1,36 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class AccountMerge : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? old_account_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? new_account_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? merge_date { get; set; } + + public bool Equals(AccountMerge obj) + { + return + old_account_id.TrueEquals(obj.old_account_id) && + new_account_id.TrueEquals(obj.new_account_id) && + merge_date.TrueEquals(obj.merge_date); + } + + public bool EqualsDynamic(dynamic obj) + { + return + old_account_id.TrueEquals((int?) obj.old_account_id) && + new_account_id.TrueEquals((int?) obj.new_account_id) && + merge_date.TrueEquals((DateTime?) obj.merge_date); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Answer.cs b/benchmark/SerializerBenchmark/Models/Answer.cs new file mode 100644 index 000000000..ec0464b6e --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Answer.cs @@ -0,0 +1,142 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Answer : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? answer_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? locked_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public DateTime? last_edit_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public DateTime? last_activity_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public DateTime? community_owned_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public bool? is_accepted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public ShallowUser owner { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public int? up_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public int? down_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public List comments { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(17), oldmsgpack::MessagePack.Key(17 - 1), newmsgpack::MessagePack.Key(17 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(18), oldmsgpack::MessagePack.Key(18 - 1), newmsgpack::MessagePack.Key(18 - 1)] + public bool? upvoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(19), oldmsgpack::MessagePack.Key(19 - 1), newmsgpack::MessagePack.Key(19 - 1)] + public bool? downvoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(20), oldmsgpack::MessagePack.Key(20 - 1), newmsgpack::MessagePack.Key(20 - 1)] + public bool? accepted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(21), oldmsgpack::MessagePack.Key(21 - 1), newmsgpack::MessagePack.Key(21 - 1)] + public ShallowUser last_editor { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(22), oldmsgpack::MessagePack.Key(22 - 1), newmsgpack::MessagePack.Key(22 - 1)] + public int? comment_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(23), oldmsgpack::MessagePack.Key(23 - 1), newmsgpack::MessagePack.Key(23 - 1)] + public string body_markdown { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(24), oldmsgpack::MessagePack.Key(24 - 1), newmsgpack::MessagePack.Key(24 - 1)] + public string share_link { get; set; } + + public bool Equals(Answer obj) + { + return + accepted.TrueEquals(obj.accepted) && + answer_id.TrueEquals(obj.answer_id) && + body.TrueEqualsString(obj.body) && + body_markdown.TrueEqualsString(obj.body_markdown) && + comment_count.TrueEquals(obj.comment_count) && + comments.TrueEqualsList(obj.comments) && + community_owned_date.TrueEquals(obj.community_owned_date) && + creation_date.TrueEquals(obj.creation_date) && + down_vote_count.TrueEquals(obj.down_vote_count) && + downvoted.TrueEquals(obj.downvoted) && + is_accepted.TrueEquals(obj.is_accepted) && + last_activity_date.TrueEquals(obj.last_activity_date) && + last_edit_date.TrueEquals(obj.last_edit_date) && + last_editor.TrueEquals(obj.last_editor) && + link.TrueEqualsString(obj.link) && + locked_date.TrueEquals(obj.locked_date) && + owner.TrueEquals(obj.owner) && + question_id.TrueEquals(obj.question_id) && + score.TrueEquals(obj.score) && + share_link.TrueEqualsString(obj.share_link) && + tags.TrueEqualsString(obj.tags) && + title.TrueEqualsString(obj.title) && + up_vote_count.TrueEquals(obj.up_vote_count) && + upvoted.TrueEquals(obj.upvoted); + } + + public bool EqualsDynamic(dynamic obj) + { + return + accepted.TrueEquals((bool?) obj.accepted) && + answer_id.TrueEquals((int?) obj.answer_id) && + body.TrueEqualsString((string) obj.body) && + body_markdown.TrueEqualsString((string) obj.body_markdown) && + comment_count.TrueEquals((int?) obj.comment_count) && + comments.TrueEqualsListDynamic((IEnumerable) obj.comments) && + community_owned_date.TrueEquals((DateTime?) obj.community_owned_date) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + down_vote_count.TrueEquals((int?) obj.down_vote_count) && + downvoted.TrueEquals((bool?) obj.downvoted) && + is_accepted.TrueEquals((bool?) obj.is_accepted) && + last_activity_date.TrueEquals((DateTime?) obj.last_activity_date) && + last_edit_date.TrueEquals((DateTime?) obj.last_edit_date) && + (last_editor == null && obj.last_editor == null || last_editor.EqualsDynamic(obj.last_editor)) && + link.TrueEqualsString((string) obj.link) && + locked_date.TrueEquals((DateTime?) obj.locked_date) && + (owner == null && obj.owner == null || owner.EqualsDynamic(obj.owner)) && + question_id.TrueEquals((int?) obj.question_id) && + score.TrueEquals((int?) obj.score) && + share_link.TrueEqualsString((string) obj.share_link) && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title.TrueEqualsString((string) obj.title) && + up_vote_count.TrueEquals((int?) obj.up_vote_count) && + upvoted.TrueEquals((bool?) obj.upvoted); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Badge.cs b/benchmark/SerializerBenchmark/Models/Badge.cs new file mode 100644 index 000000000..8cfa5b675 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Badge.cs @@ -0,0 +1,73 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum BadgeRank : byte + { + bronze = 3, + silver = 2, + gold = 1 + } + + public enum BadgeType + { + named = 1, + tag_based = 2 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Badge : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? badge_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public BadgeRank? rank { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? award_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public BadgeType? badge_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public ShallowUser user { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public string link { get; set; } + + public bool Equals(Badge obj) + { + return + award_count.TrueEquals(obj.award_count) && + badge_id.TrueEquals(obj.badge_id) && + badge_type.TrueEquals(obj.badge_type) && + description.TrueEqualsString(obj.description) && + link.TrueEqualsString(obj.link) && + name.TrueEqualsString(obj.name) && + rank.TrueEquals(obj.rank) && + user.TrueEquals(obj.user); + } + + public bool EqualsDynamic(dynamic obj) + { + return + award_count.TrueEquals((int?) obj.award_count) && + badge_id.TrueEquals((int?) obj.badge_id) && + badge_type.TrueEquals((BadgeType?) obj.badge_type) && + description.TrueEqualsString((string) obj.description) && + link.TrueEqualsString((string) obj.link) && + name.TrueEqualsString((string) obj.name) && + rank.TrueEquals((BadgeRank?) obj.rank) && + (user == null && obj.user == null || user.EqualsDynamic(obj.user)); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Comment.cs b/benchmark/SerializerBenchmark/Models/Comment.cs new file mode 100644 index 000000000..8daf4abaa --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Comment.cs @@ -0,0 +1,88 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum PostType : byte + { + question = 1, + answer = 2 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Comment : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? comment_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public PostType? post_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public bool? edited { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public ShallowUser owner { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public ShallowUser reply_to_user { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public string body_markdown { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public bool? upvoted { get; set; } + + public bool Equals(Comment obj) + { + return + body.TrueEqualsString(obj.body) && + body_markdown.TrueEqualsString(obj.body_markdown) && + comment_id.TrueEquals(obj.comment_id) && + creation_date.TrueEquals(obj.creation_date) && + edited.TrueEquals(obj.edited) && + link.TrueEqualsString(obj.link) && + owner.TrueEquals(obj.owner) && + post_id.TrueEquals(obj.post_id) && + post_type.TrueEquals(obj.post_type) && + reply_to_user.TrueEquals(obj.reply_to_user) && + score.TrueEquals(obj.score) && + upvoted.TrueEquals(obj.upvoted); + } + + public bool EqualsDynamic(dynamic obj) + { + return + body.TrueEqualsString((string) obj.body) && + body_markdown.TrueEqualsString((string) obj.body_markdown) && + comment_id.TrueEquals((int?) obj.comment_id) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + edited.TrueEquals((bool?) obj.edited) && + link.TrueEqualsString((string) obj.link) && + (owner == null && obj.owner == null || owner.EqualsDynamic(obj.owner)) && + post_id.TrueEquals((int?) obj.post_id) && + post_type.TrueEquals((PostType?) obj.post_type) && + (reply_to_user == null && obj.reply_to_user == null || + reply_to_user.EqualsDynamic(obj.reply_to_user)) && + score.TrueEquals((int?) obj.score) && + upvoted.TrueEquals((bool?) obj.upvoted); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Error.cs b/benchmark/SerializerBenchmark/Models/Error.cs new file mode 100644 index 000000000..c0ace9c32 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Error.cs @@ -0,0 +1,35 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Error : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? error_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string error_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string description { get; set; } + + public bool Equals(Error obj) + { + return + error_id.TrueEquals(obj.error_id) && + error_name.TrueEqualsString(obj.error_name) && + description.TrueEqualsString(obj.description); + } + + public bool EqualsDynamic(dynamic obj) + { + return + error_id.TrueEquals((int?) obj.error_id) && + error_name.TrueEqualsString((string) obj.error_name) && + description.TrueEqualsString((string) obj.description); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Event.cs b/benchmark/SerializerBenchmark/Models/Event.cs new file mode 100644 index 000000000..488768dc1 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Event.cs @@ -0,0 +1,55 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum EventType : byte + { + question_posted = 1, + answer_posted = 2, + comment_posted = 3, + post_edited = 4, + user_created = 5 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Event : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public EventType? event_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? event_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string excerpt { get; set; } + + public bool Equals(Event obj) + { + return + creation_date.TrueEquals(obj.creation_date) && + event_id.TrueEquals(obj.event_id) && + event_type.TrueEquals(obj.event_type) && + excerpt.TrueEqualsString(obj.excerpt) && + link.TrueEqualsString(obj.link); + } + + public bool EqualsDynamic(dynamic obj) + { + return + creation_date.TrueEquals((DateTime?) obj.creation_date) && + event_id.TrueEquals((int?) obj.event_id) && + event_type.TrueEquals((EventType?) obj.event_type) && + excerpt.TrueEqualsString((string) obj.excerpt) && + link.TrueEqualsString((string) obj.link); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Feed.cs b/benchmark/SerializerBenchmark/Models/Feed.cs new file mode 100644 index 000000000..7640ecdfb --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Feed.cs @@ -0,0 +1,688 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class MobileFeed : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public List hot_questions { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public List inbox_items { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public List likely_to_answer_questions { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public List reputation_events { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public List cross_site_interesting_questions { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public List badges { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public List earned_privileges { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public List upcoming_privileges { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public List community_bulletins { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public List association_bonuses { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public List careers_job_ads { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public List banner_ads { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public long? before { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public long? since { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public int? account_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public MobileUpdateNotice update_notice { get; set; } + + public bool Equals(MobileFeed obj) + { + return + account_id == obj.account_id && + association_bonuses.TrueEqualsList(obj.association_bonuses) && + badges.TrueEqualsList(obj.badges) && + banner_ads.TrueEqualsList(obj.banner_ads) && + before == obj.before && + careers_job_ads.TrueEqualsList(obj.careers_job_ads) && + community_bulletins.TrueEqualsList(obj.community_bulletins) && + cross_site_interesting_questions.TrueEqualsList(obj.cross_site_interesting_questions) && + earned_privileges.TrueEqualsList(obj.earned_privileges) && + hot_questions.TrueEqualsList(obj.hot_questions) && + inbox_items.TrueEqualsList(obj.inbox_items) && + likely_to_answer_questions.TrueEqualsList(obj.likely_to_answer_questions) && + reputation_events.TrueEqualsList(obj.reputation_events) && + since == obj.since && + upcoming_privileges.TrueEqualsList(obj.upcoming_privileges) && + update_notice.TrueEquals(obj.update_notice); + } + + public bool EqualsDynamic(dynamic obj) + { + return + account_id == (int?) obj.account_id && + association_bonuses.TrueEqualsListDynamic((IEnumerable) obj.association_bonuses) && + badges.TrueEqualsListDynamic((IEnumerable) obj.badges) && + banner_ads.TrueEqualsListDynamic((IEnumerable) obj.banner_ads) && + before == (long?) obj.before && + careers_job_ads.TrueEqualsListDynamic((IEnumerable) obj.careers_job_ads) && + community_bulletins.TrueEqualsListDynamic((IEnumerable) obj.community_bulletins) && + cross_site_interesting_questions.TrueEqualsListDynamic( + (IEnumerable) obj.cross_site_interesting_questions) && + earned_privileges.TrueEqualsListDynamic((IEnumerable) obj.earned_privileges) && + hot_questions.TrueEqualsListDynamic((IEnumerable) obj.hot_questions) && + inbox_items.TrueEqualsListDynamic((IEnumerable) obj.inbox_items) && + likely_to_answer_questions.TrueEqualsListDynamic( + (IEnumerable) obj.likely_to_answer_questions) && + reputation_events.TrueEqualsListDynamic((IEnumerable) obj.reputation_events) && + since == (long?) obj.since && + upcoming_privileges.TrueEqualsListDynamic((IEnumerable) obj.upcoming_privileges) && + (update_notice == null && obj.update_notice == null || update_notice.EqualsDynamic(obj.update_notice)); + } + } + + public interface IMobileFeedBase : IGenericEquality + { + int? group_id { get; set; } + long? added_date { get; set; } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileQuestion : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public long? question_creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public long? last_activity_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public bool? is_deleted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public bool? has_accepted_answer { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileQuestion obj) + { + return + added_date == obj.added_date && + answer_count == obj.answer_count && + group_id == obj.group_id && + has_accepted_answer == obj.has_accepted_answer && + is_deleted == obj.is_deleted && + last_activity_date == obj.last_activity_date && + question_creation_date == obj.question_creation_date && + question_id == obj.question_id && + site == obj.site && + tags.TrueEqualsString(obj.tags) && + title == obj.title; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + answer_count == (int?) obj.answer_count && + group_id == (int?) obj.group_id && + has_accepted_answer == (bool?) obj.has_accepted_answer && + is_deleted == (bool?) obj.is_deleted && + last_activity_date == (long?) obj.last_activity_date && + question_creation_date == (long?) obj.question_creation_date && + question_id == (int?) obj.question_id && + site == (string) obj.site && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title == (string) obj.title; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileRepChange : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? rep_change { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileRepChange obj) + { + return + added_date == obj.added_date && + group_id == obj.group_id && + link == obj.link && + rep_change == obj.rep_change && + site == obj.site && + title == obj.title; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + group_id == (int?) obj.group_id && + link == (string) obj.link && + rep_change == (int?) obj.rep_change && + site == (string) obj.site && + title == (string) obj.title; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileInboxItem : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? answer_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? comment_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public long? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public string item_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileInboxItem obj) + { + return + added_date == obj.added_date && + answer_id == obj.answer_id && + body == obj.body && + comment_id == obj.comment_id && + creation_date == obj.creation_date && + group_id == obj.group_id && + item_type == obj.item_type && + link == obj.link && + question_id == obj.question_id && + site == obj.site && + title == obj.title; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + answer_id == (int?) obj.answer_id && + body == (string) obj.body && + comment_id == (int?) obj.comment_id && + creation_date == (long?) obj.creation_date && + group_id == (int?) obj.group_id && + item_type == (string) obj.item_type && + link == (string) obj.link && + question_id == (int?) obj.question_id && + site == (string) obj.site && + title == (string) obj.title; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileBadgeAward : IMobileFeedBase + { + public enum BadgeRank : byte + { + bronze = 1, + silver = 2, + gold = 3 + } + + public enum BadgeType + { + named = 1, + tag_based = 2 + } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string badge_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string badge_description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? badge_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public BadgeRank? rank { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public BadgeType? badge_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileBadgeAward obj) + { + return + added_date == obj.added_date && + badge_description == obj.badge_description && + badge_id == obj.badge_id && + badge_name == obj.badge_name && + badge_type == obj.badge_type && + group_id == obj.group_id && + link == obj.link && + post_id == obj.post_id && + rank == obj.rank && + site == obj.site; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + badge_description == (string) obj.badge_description && + badge_id == (int?) obj.badge_id && + badge_name == (string) obj.badge_name && + badge_type == (BadgeType?) obj.badge_type && + group_id == (int?) obj.group_id && + link == (string) obj.link && + post_id == (int?) obj.post_id && + rank == (BadgeRank?) obj.rank && + site == (string) obj.site; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobilePrivilege : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string privilege_short_description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string privilege_long_description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? privilege_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? reputation_required { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobilePrivilege obj) + { + return + added_date == obj.added_date && + group_id == obj.group_id && + link == obj.link && + privilege_id == obj.privilege_id && + privilege_long_description == obj.privilege_long_description && + privilege_short_description == obj.privilege_short_description && + reputation_required == obj.reputation_required && + site == obj.site; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + group_id == (int?) obj.group_id && + link == (string) obj.link && + privilege_id == (int?) obj.privilege_id && + privilege_long_description == (string) obj.privilege_long_description && + privilege_short_description == (string) obj.privilege_short_description && + reputation_required == (int?) obj.reputation_required && + site == (string) obj.site; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileCommunityBulletin : IMobileFeedBase + { + public enum CommunityBulletinType : byte + { + blog_post = 1, + featured_meta_question = 2, + upcoming_event = 3 + } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public CommunityBulletinType? bulletin_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public long? begin_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public long? end_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public string custom_date_string { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public bool? is_deleted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public bool? has_accepted_answer { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public bool? is_promoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileCommunityBulletin obj) + { + return + added_date == obj.added_date && + answer_count == obj.answer_count && + begin_date == obj.begin_date && + bulletin_type == obj.bulletin_type && + custom_date_string == obj.custom_date_string && + end_date == obj.end_date && + group_id == obj.group_id && + has_accepted_answer == obj.has_accepted_answer && + is_deleted == obj.is_deleted && + is_promoted == obj.is_promoted && + link == obj.link && + site == obj.site && + tags.TrueEqualsString(obj.tags) && + title == obj.title; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + answer_count == (int?) obj.answer_count && + begin_date == (long?) obj.begin_date && + bulletin_type == (CommunityBulletinType?) obj.bulletin_type && + custom_date_string == (string) obj.custom_date_string && + end_date == (long?) obj.end_date && + group_id == (int?) obj.group_id && + has_accepted_answer == (bool?) obj.has_accepted_answer && + is_deleted == (bool?) obj.is_deleted && + is_promoted == (bool?) obj.is_promoted && + link == (string) obj.link && + site == (string) obj.site && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title == (string) obj.title; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileAssociationBonus : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? amount { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileAssociationBonus obj) + { + return + added_date == obj.added_date && + amount == obj.amount && + group_id == obj.group_id && + site == obj.site; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + amount == (int?) obj.amount && + group_id == (int?) obj.group_id && + site == (string) obj.site; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileCareersJobAd : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? job_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string company_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public string location { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileCareersJobAd obj) + { + return + added_date == obj.added_date && + company_name == obj.company_name && + group_id == obj.group_id && + job_id == obj.job_id && + link == obj.link && + location == obj.location && + title == obj.title; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + company_name == (string) obj.company_name && + group_id == (int?) obj.group_id && + job_id == (int?) obj.job_id && + link == (string) obj.link && + location == (string) obj.location && + title == (string) obj.title; + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileBannerAd : IMobileFeedBase + { + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public List images { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? group_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public long? added_date { get; set; } + + public bool Equals(MobileBannerAd obj) + { + return + added_date == obj.added_date && + group_id == obj.group_id && + images.TrueEqualsList(obj.images) && + link == obj.link; + } + + public bool EqualsDynamic(dynamic obj) + { + return + added_date == (long?) obj.added_date && + group_id == (int?) obj.group_id && + images.TrueEqualsListDynamic((IEnumerable) obj.images) && + link == (string) obj.link; + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileBannerAdImage : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string image_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? width { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? height { get; set; } + + public bool Equals(MobileBannerAdImage obj) + { + return + height == obj.height && + image_url == obj.image_url && + width == obj.width; + } + + public bool EqualsDynamic(dynamic obj) + { + return + height == (int?) obj.height && + image_url == (string) obj.image_url && + width == (int?) obj.width; + } + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public sealed class MobileUpdateNotice : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public bool? should_update { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string message { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string minimum_supported_version { get; set; } + + public bool Equals(MobileUpdateNotice obj) + { + return + message == obj.message && + minimum_supported_version == obj.minimum_supported_version && + should_update == obj.should_update; + } + + public bool EqualsDynamic(dynamic obj) + { + return + message == (string) obj.message && + minimum_supported_version == (string) obj.minimum_supported_version && + should_update == (bool?) obj.should_update; + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/FlagOption.cs b/benchmark/SerializerBenchmark/Models/FlagOption.cs new file mode 100644 index 000000000..49dc0dc10 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/FlagOption.cs @@ -0,0 +1,66 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class FlagOption : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? option_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public bool? requires_comment { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public bool? requires_site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public bool? requires_question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public string description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public List sub_options { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public bool? has_flagged { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? count { get; set; } + + public bool Equals(FlagOption obj) + { + return + count.TrueEquals(obj.count) && + description.TrueEqualsString(obj.description) && + has_flagged.TrueEquals(obj.has_flagged) && + option_id.TrueEquals(obj.option_id) && + requires_comment.TrueEquals(obj.requires_comment) && + requires_question_id.TrueEquals(obj.requires_question_id) && + requires_site.TrueEquals(obj.requires_site) && + sub_options.TrueEqualsList(obj.sub_options) && + title.TrueEqualsString(obj.title); + } + + public bool EqualsDynamic(dynamic obj) + { + return + count.TrueEquals((int?) obj.count) && + description.TrueEqualsString((string) obj.description) && + has_flagged.TrueEquals((bool?) obj.has_flagged) && + option_id.TrueEquals((int?) obj.option_id) && + requires_comment.TrueEquals((bool?) obj.requires_comment) && + requires_question_id.TrueEquals((bool?) obj.requires_question_id) && + requires_site.TrueEquals((bool?) obj.requires_site) && + sub_options.TrueEqualsListDynamic((IEnumerable) obj.sub_options) && + title.TrueEqualsString((string) obj.title); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/InboxItem.cs b/benchmark/SerializerBenchmark/Models/InboxItem.cs new file mode 100644 index 000000000..8996ceeab --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/InboxItem.cs @@ -0,0 +1,83 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum InboxItemType + { + comment = 1, + chat_message = 2, + new_answer = 3, + careers_message = 4, + careers_invitations = 5, + meta_question = 6, + post_notice = 7, + moderator_message = 8 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class InboxItem : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public InboxItemType? item_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? answer_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? comment_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public bool? is_unread { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public Info.Site site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public string link { get; set; } + + public bool Equals(InboxItem obj) + { + return + answer_id.TrueEquals(obj.answer_id) && + body.TrueEqualsString(obj.body) && + comment_id.TrueEquals(obj.comment_id) && + creation_date.TrueEquals(obj.creation_date) && + is_unread.TrueEquals(obj.is_unread) && + item_type.TrueEquals(obj.item_type) && + link.TrueEqualsString(obj.link) && + question_id.TrueEquals(obj.question_id) && + site.TrueEquals(obj.site) && + title.TrueEqualsString(obj.title); + } + + public bool EqualsDynamic(dynamic obj) + { + return + answer_id.TrueEquals((int?) obj.answer_id) && + body.TrueEqualsString((string) obj.body) && + comment_id.TrueEquals((int?) obj.comment_id) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + is_unread.TrueEquals((bool?) obj.is_unread) && + item_type.TrueEquals((InboxItemType?) obj.item_type) && + link.TrueEqualsString((string) obj.link) && + question_id.TrueEquals((int?) obj.question_id) && + (site == null && obj.site == null || site.EqualsDynamic(obj.site)) && + title.TrueEqualsString((string) obj.title); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Info.cs b/benchmark/SerializerBenchmark/Models/Info.cs new file mode 100644 index 000000000..7ef7e363c --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Info.cs @@ -0,0 +1,272 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Info : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? total_questions { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? total_unanswered { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? total_accepted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? total_answers { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public decimal? questions_per_minute { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public decimal? answers_per_minute { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? total_comments { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public int? total_votes { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? total_badges { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public decimal? badges_per_minute { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public int? total_users { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public int? new_active_users { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public string api_revision { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public Site site { get; set; } + + public bool Equals(Info obj) + { + return + answers_per_minute.TrueEquals(obj.answers_per_minute) && + api_revision.TrueEqualsString(obj.api_revision) && + badges_per_minute.TrueEquals(obj.badges_per_minute) && + new_active_users.TrueEquals(obj.new_active_users) && + questions_per_minute.TrueEquals(obj.questions_per_minute) && + site.TrueEquals(obj.site) && + total_accepted.TrueEquals(obj.total_accepted) && + total_answers.TrueEquals(obj.total_answers) && + total_badges.TrueEquals(obj.total_badges) && + total_comments.TrueEquals(obj.total_comments) && + total_questions.TrueEquals(obj.total_questions) && + total_unanswered.TrueEquals(obj.total_unanswered) && + total_users.TrueEquals(obj.total_users) && + total_votes.TrueEquals(obj.total_votes); + } + + public bool EqualsDynamic(dynamic obj) + { + return + answers_per_minute.TrueEquals((decimal?) obj.answers_per_minute) && + api_revision.TrueEqualsString((string) obj.api_revision) && + badges_per_minute.TrueEquals((decimal?) obj.badges_per_minute) && + new_active_users.TrueEquals((int?) obj.new_active_users) && + questions_per_minute.TrueEquals((decimal?) obj.questions_per_minute) && + (site == null && obj.site == null || site.EqualsDynamic(obj.site)) && + total_accepted.TrueEquals((int?) obj.total_accepted) && + total_answers.TrueEquals((int?) obj.total_answers) && + total_badges.TrueEquals((int?) obj.total_badges) && + total_comments.TrueEquals((int?) obj.total_comments) && + total_questions.TrueEquals((int?) obj.total_questions) && + total_unanswered.TrueEquals((int?) obj.total_unanswered) && + total_users.TrueEquals((int?) obj.total_users) && + total_votes.TrueEquals((int?) obj.total_votes); + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Site : IGenericEquality + { + public enum SiteState + { + normal, + closed_beta, + open_beta, + linked_meta + } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string site_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string logo_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string api_site_parameter { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string site_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public string audience { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public string icon_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public List aliases { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public SiteState? site_state { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public Styling styling { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public DateTime? closed_beta_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public DateTime? open_beta_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public DateTime? launch_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public string favicon_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public List related_sites { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public string twitter_account { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(17), oldmsgpack::MessagePack.Key(17 - 1), newmsgpack::MessagePack.Key(17 - 1)] + public List markdown_extensions { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(18), oldmsgpack::MessagePack.Key(18 - 1), newmsgpack::MessagePack.Key(18 - 1)] + public string high_resolution_icon_url { get; set; } + + public bool Equals(Site obj) + { + return + aliases.TrueEqualsString(obj.aliases) && + api_site_parameter.TrueEqualsString(obj.api_site_parameter) && + audience.TrueEqualsString(obj.audience) && + closed_beta_date.TrueEquals(obj.closed_beta_date) && + favicon_url.TrueEqualsString(obj.favicon_url) && + high_resolution_icon_url.TrueEqualsString(obj.high_resolution_icon_url) && + icon_url.TrueEqualsString(obj.icon_url) && + launch_date.TrueEquals(obj.launch_date) && + logo_url.TrueEqualsString(obj.logo_url) && + markdown_extensions.TrueEqualsString(obj.markdown_extensions) && + name.TrueEqualsString(obj.name) && + open_beta_date.TrueEquals(obj.open_beta_date) && + related_sites.TrueEqualsList(obj.related_sites) && + site_state.TrueEquals(obj.site_state) && + site_type.TrueEqualsString(obj.site_type) && + site_url.TrueEqualsString(obj.site_url) && + styling.TrueEquals(obj.styling) && + twitter_account.TrueEqualsString(obj.twitter_account); + } + + public bool EqualsDynamic(dynamic obj) + { + return + aliases.TrueEqualsString((IEnumerable) obj.aliases) && + api_site_parameter.TrueEqualsString((string) obj.api_site_parameter) && + audience.TrueEqualsString((string) obj.audience) && + closed_beta_date.TrueEquals((DateTime?) obj.closed_beta_date) && + favicon_url.TrueEqualsString((string) obj.favicon_url) && + high_resolution_icon_url.TrueEqualsString((string) obj.high_resolution_icon_url) && + icon_url.TrueEqualsString((string) obj.icon_url) && + launch_date.TrueEquals((DateTime?) obj.launch_date) && + logo_url.TrueEqualsString((string) obj.logo_url) && + markdown_extensions.TrueEqualsString((IEnumerable) obj.markdown_extensions) && + name.TrueEqualsString((string) obj.name) && + open_beta_date.TrueEquals((DateTime?) obj.open_beta_date) && + related_sites.TrueEqualsListDynamic((IEnumerable) obj.related_sites) && + site_state.TrueEquals((SiteState?) obj.site_state) && + site_type.TrueEqualsString((string) obj.site_type) && + site_url.TrueEqualsString((string) obj.site_url) && + (styling == null && obj.styling == null || styling.EqualsDynamic(obj.styling)) && + twitter_account.TrueEqualsString((string) obj.twitter_account); + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Styling : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string link_color { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string tag_foreground_color { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string tag_background_color { get; set; } + + public bool Equals(Styling obj) + { + return + link_color.TrueEqualsString(obj.link_color) && + tag_background_color.TrueEqualsString(obj.tag_background_color) && + tag_foreground_color.TrueEqualsString(obj.tag_foreground_color); + } + + public bool EqualsDynamic(dynamic obj) + { + return + link_color.TrueEqualsString((string) obj.link_color) && + tag_background_color.TrueEqualsString((string) obj.tag_background_color) && + tag_foreground_color.TrueEqualsString((string) obj.tag_foreground_color); + } + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class RelatedSite : IGenericEquality + { + public enum SiteRelation + { + parent, + meta, + chat + } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string site_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public SiteRelation? relation { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string api_site_parameter { get; set; } + + public bool Equals(RelatedSite obj) + { + return + name.TrueEqualsString(obj.name) && + relation.TrueEquals(obj.relation) && + api_site_parameter.TrueEqualsString(obj.api_site_parameter); + } + + public bool EqualsDynamic(dynamic obj) + { + return + name.TrueEqualsString((string) obj.name) && + relation.TrueEquals((SiteRelation?) obj.relation) && + api_site_parameter.TrueEqualsString((string) obj.api_site_parameter); + } + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/NetworkUser.cs b/benchmark/SerializerBenchmark/Models/NetworkUser.cs new file mode 100644 index 000000000..172d1f1f9 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/NetworkUser.cs @@ -0,0 +1,76 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class NetworkUser : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string site_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string site_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? reputation { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? account_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public UserType? user_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public User.BadgeCount badge_counts { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public DateTime? last_access_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public int? question_count { get; set; } + + public bool Equals(NetworkUser obj) + { + return + account_id.TrueEquals(obj.account_id) && + answer_count.TrueEquals(obj.answer_count) && + badge_counts.TrueEquals(obj.badge_counts) && + creation_date.TrueEquals(obj.creation_date) && + last_access_date.TrueEquals(obj.last_access_date) && + question_count.TrueEquals(obj.question_count) && + reputation.TrueEquals(obj.reputation) && + site_name.TrueEqualsString(obj.site_name) && + site_url.TrueEqualsString(obj.site_url) && + user_id.TrueEquals(obj.user_id) && + user_type.TrueEquals(obj.user_type); + } + + public bool EqualsDynamic(dynamic obj) + { + return + account_id.TrueEquals((int?) obj.account_id) && + answer_count.TrueEquals((int?) obj.answer_count) && + (badge_counts == null && obj.badge_counts == null || badge_counts.EqualsDynamic(obj.badge_counts)) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + last_access_date.TrueEquals((DateTime?) obj.last_access_date) && + question_count.TrueEquals((int?) obj.question_count) && + reputation.TrueEquals((int?) obj.reputation) && + site_name.TrueEqualsString((string) obj.site_name) && + site_url.TrueEqualsString((string) obj.site_url) && + user_id.TrueEquals((int?) obj.user_id) && + user_type.TrueEquals((UserType?) obj.user_type); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Notification.cs b/benchmark/SerializerBenchmark/Models/Notification.cs new file mode 100644 index 000000000..b2d884c0f --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Notification.cs @@ -0,0 +1,68 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum NotificationType : byte + { + generic = 1, + accounts_associated = 8, + badge_earned = 5, + profile_activity = 2, + bounty_expired = 3, + bounty_expires_in_one_day = 4, + bounty_expires_in_three_days = 6, + edit_suggested = 22, + new_privilege = 9, + post_migrated = 10, + moderator_message = 11, + registration_reminder = 12, + substantive_edit = 23, + reputation_bonus = 7, + bounty_grace_period_started = 24 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Notification : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public NotificationType? notification_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public Info.Site site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public bool? is_unread { get; set; } + + public bool Equals(Notification obj) + { + return + body.TrueEqualsString(obj.body) && + site.TrueEquals(obj.site) && + creation_date.TrueEquals(obj.creation_date) && + post_id.TrueEquals(obj.post_id) && + is_unread.TrueEquals(obj.is_unread); + } + + public bool EqualsDynamic(dynamic obj) + { + return + body.TrueEqualsString((string) obj.body) && + (site == null && obj.site == null || site.EqualsDynamic(obj.site)) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + post_id.TrueEquals((int?) obj.post_id) && + is_unread.TrueEquals((bool?) obj.is_unread); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Post.cs b/benchmark/SerializerBenchmark/Models/Post.cs new file mode 100644 index 000000000..fe0e85c8c --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Post.cs @@ -0,0 +1,112 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Post : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public PostType? post_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public ShallowUser owner { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public DateTime? last_activity_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public DateTime? last_edit_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public int? score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? up_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public int? down_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public List comments { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public bool? upvoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public bool? downvoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public ShallowUser last_editor { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public int? comment_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(17), oldmsgpack::MessagePack.Key(17 - 1), newmsgpack::MessagePack.Key(17 - 1)] + public string body_markdown { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(18), oldmsgpack::MessagePack.Key(18 - 1), newmsgpack::MessagePack.Key(18 - 1)] + public string share_link { get; set; } + + public bool Equals(Post obj) + { + return + body.TrueEqualsString(obj.body) && + body_markdown.TrueEqualsString(obj.body_markdown) && + comment_count.TrueEquals(obj.comment_count) && + comments.TrueEqualsList(obj.comments) && + creation_date.TrueEquals(obj.creation_date) && + down_vote_count.TrueEquals(obj.down_vote_count) && + downvoted.TrueEquals(obj.downvoted) && + last_activity_date.TrueEquals(obj.last_activity_date) && + last_edit_date.TrueEquals(obj.last_edit_date) && + last_editor.TrueEquals(obj.last_editor) && + link.TrueEqualsString(obj.link) && + owner.TrueEquals(obj.owner) && + post_id.TrueEquals(obj.post_id) && + post_type.TrueEquals(obj.post_type) && + score.TrueEquals(obj.score) && + share_link.TrueEqualsString(obj.share_link) && + up_vote_count.TrueEquals(obj.up_vote_count) && + upvoted.TrueEquals(obj.upvoted); + } + + public bool EqualsDynamic(dynamic obj) + { + return + body.TrueEqualsString((string) obj.body) && + body_markdown.TrueEqualsString((string) obj.body_markdown) && + comment_count.TrueEquals((int?) obj.comment_count) && + comments.TrueEqualsListDynamic((IEnumerable) obj.comments) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + down_vote_count.TrueEquals((int?) obj.down_vote_count) && + downvoted.TrueEquals((bool?) obj.downvoted) && + last_activity_date.TrueEquals((DateTime?) obj.last_activity_date) && + last_edit_date.TrueEquals((DateTime?) obj.last_edit_date) && + (last_editor == null && obj.last_editor == null || last_editor.EqualsDynamic(obj.last_editor)) && + link.TrueEqualsString((string) obj.link) && + (owner == null && obj.owner == null || owner.EqualsDynamic(obj.owner)) && + post_id.TrueEquals((int?) obj.post_id) && + post_type.TrueEquals((PostType?) obj.post_type) && + score.TrueEquals((int?) obj.score) && + share_link.TrueEqualsString((string) obj.share_link) && + up_vote_count.TrueEquals((int?) obj.up_vote_count) && + upvoted.TrueEquals((bool?) obj.upvoted); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Privilege.cs b/benchmark/SerializerBenchmark/Models/Privilege.cs new file mode 100644 index 000000000..ae07c15ef --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Privilege.cs @@ -0,0 +1,35 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Privilege : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string short_description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? reputation { get; set; } + + public bool Equals(Privilege obj) + { + return + description.TrueEqualsString(obj.description) && + reputation.TrueEquals(obj.reputation) && + short_description.TrueEqualsString(obj.short_description); + } + + public bool EqualsDynamic(dynamic obj) + { + return + description.TrueEqualsString((string) obj.description) && + reputation.TrueEquals((int?) obj.reputation) && + short_description.TrueEqualsString((string) obj.short_description); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Question.cs b/benchmark/SerializerBenchmark/Models/Question.cs new file mode 100644 index 000000000..df6731a3c --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Question.cs @@ -0,0 +1,359 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Question : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public DateTime? last_edit_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public DateTime? last_activity_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public DateTime? locked_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public DateTime? community_owned_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? accepted_answer_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public MigrationInfo migrated_to { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public MigrationInfo migrated_from { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public DateTime? bounty_closes_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public int? bounty_amount { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public DateTime? closed_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public DateTime? protected_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(17), oldmsgpack::MessagePack.Key(17 - 1), newmsgpack::MessagePack.Key(17 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(18), oldmsgpack::MessagePack.Key(18 - 1), newmsgpack::MessagePack.Key(18 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(19), oldmsgpack::MessagePack.Key(19 - 1), newmsgpack::MessagePack.Key(19 - 1)] + public string closed_reason { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(20), oldmsgpack::MessagePack.Key(20 - 1), newmsgpack::MessagePack.Key(20 - 1)] + public int? up_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(21), oldmsgpack::MessagePack.Key(21 - 1), newmsgpack::MessagePack.Key(21 - 1)] + public int? down_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(22), oldmsgpack::MessagePack.Key(22 - 1), newmsgpack::MessagePack.Key(22 - 1)] + public int? favorite_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(23), oldmsgpack::MessagePack.Key(23 - 1), newmsgpack::MessagePack.Key(23 - 1)] + public int? view_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(24), oldmsgpack::MessagePack.Key(24 - 1), newmsgpack::MessagePack.Key(24 - 1)] + public ShallowUser owner { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(25), oldmsgpack::MessagePack.Key(25 - 1), newmsgpack::MessagePack.Key(25 - 1)] + public List comments { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(26), oldmsgpack::MessagePack.Key(26 - 1), newmsgpack::MessagePack.Key(26 - 1)] + public List answers { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(27), oldmsgpack::MessagePack.Key(27 - 1), newmsgpack::MessagePack.Key(27 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(28), oldmsgpack::MessagePack.Key(28 - 1), newmsgpack::MessagePack.Key(28 - 1)] + public bool? is_answered { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(29), oldmsgpack::MessagePack.Key(29 - 1), newmsgpack::MessagePack.Key(29 - 1)] + public int? close_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(30), oldmsgpack::MessagePack.Key(30 - 1), newmsgpack::MessagePack.Key(30 - 1)] + public int? reopen_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(31), oldmsgpack::MessagePack.Key(31 - 1), newmsgpack::MessagePack.Key(31 - 1)] + public int? delete_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(32), oldmsgpack::MessagePack.Key(32 - 1), newmsgpack::MessagePack.Key(32 - 1)] + public Notice notice { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(33), oldmsgpack::MessagePack.Key(33 - 1), newmsgpack::MessagePack.Key(33 - 1)] + public bool? upvoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(34), oldmsgpack::MessagePack.Key(34 - 1), newmsgpack::MessagePack.Key(34 - 1)] + public bool? downvoted { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(35), oldmsgpack::MessagePack.Key(35 - 1), newmsgpack::MessagePack.Key(35 - 1)] + public bool? favorited { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(36), oldmsgpack::MessagePack.Key(36 - 1), newmsgpack::MessagePack.Key(36 - 1)] + public ShallowUser last_editor { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(37), oldmsgpack::MessagePack.Key(37 - 1), newmsgpack::MessagePack.Key(37 - 1)] + public int? comment_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(38), oldmsgpack::MessagePack.Key(38 - 1), newmsgpack::MessagePack.Key(38 - 1)] + public string body_markdown { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(39), oldmsgpack::MessagePack.Key(39 - 1), newmsgpack::MessagePack.Key(39 - 1)] + public ClosedDetails closed_details { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(40), oldmsgpack::MessagePack.Key(40 - 1), newmsgpack::MessagePack.Key(40 - 1)] + public string share_link { get; set; } + + public bool Equals(Question obj) + { + return + accepted_answer_id.TrueEquals(obj.accepted_answer_id) && + answer_count.TrueEquals(obj.answer_count) && + answers.TrueEqualsList(obj.answers) && + body.TrueEqualsString(obj.body) && + body_markdown.TrueEqualsString(obj.body_markdown) && + bounty_amount.TrueEquals(obj.bounty_amount) && + bounty_closes_date.TrueEquals(obj.bounty_closes_date) && + close_vote_count.TrueEquals(obj.close_vote_count) && + closed_date.TrueEquals(obj.closed_date) && + closed_details.TrueEquals(obj.closed_details) && + closed_reason.TrueEqualsString(obj.closed_reason) && + comment_count.TrueEquals(obj.comment_count) && + comments.TrueEqualsList(obj.comments) && + community_owned_date.TrueEquals(obj.community_owned_date) && + creation_date.TrueEquals(obj.creation_date) && + delete_vote_count.TrueEquals(obj.delete_vote_count) && + down_vote_count.TrueEquals(obj.down_vote_count) && + downvoted.TrueEquals(obj.downvoted) && + favorite_count.TrueEquals(obj.favorite_count) && + favorited.TrueEquals(obj.favorited) && + is_answered.TrueEquals(obj.is_answered) && + last_activity_date.TrueEquals(obj.last_activity_date) && + last_edit_date.TrueEquals(obj.last_edit_date) && + last_editor.TrueEquals(obj.last_editor) && + link.TrueEqualsString(obj.link) && + locked_date.TrueEquals(obj.locked_date) && + migrated_from.TrueEquals(obj.migrated_from) && + migrated_to.TrueEquals(obj.migrated_to) && + notice.TrueEquals(obj.notice) && + owner.TrueEquals(obj.owner) && + protected_date.TrueEquals(obj.protected_date) && + question_id.TrueEquals(obj.question_id) && + reopen_vote_count.TrueEquals(obj.reopen_vote_count) && + score.TrueEquals(obj.score) && + share_link.TrueEqualsString(obj.share_link) && + tags.TrueEqualsString(obj.tags) && + title.TrueEqualsString(obj.title) && + up_vote_count.TrueEquals(obj.up_vote_count) && + upvoted.TrueEquals(obj.upvoted) && + view_count.TrueEquals(obj.view_count); + } + + public bool EqualsDynamic(dynamic obj) + { + return + accepted_answer_id.TrueEquals((int?) obj.accepted_answer_id) && + answer_count.TrueEquals((int?) obj.answer_count) && + answers.TrueEqualsListDynamic((IEnumerable) obj.answers) && + body.TrueEqualsString((string) obj.body) && + body_markdown.TrueEqualsString((string) obj.body_markdown) && + bounty_amount.TrueEquals((int?) obj.bounty_amount) && + bounty_closes_date.TrueEquals((DateTime?) obj.bounty_closes_date) && + close_vote_count.TrueEquals((int?) obj.close_vote_count) && + closed_date.TrueEquals((DateTime?) obj.closed_date) && + (closed_details == null && obj.closed_details == null || + closed_details.EqualsDynamic(obj.closed_details)) && + closed_reason.TrueEqualsString((string) obj.closed_reason) && + comment_count.TrueEquals((int?) obj.comment_count) && + comments.TrueEqualsListDynamic((IEnumerable) obj.comments) && + community_owned_date.TrueEquals((DateTime?) obj.community_owned_date) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + delete_vote_count.TrueEquals((int?) obj.delete_vote_count) && + down_vote_count.TrueEquals((int?) obj.down_vote_count) && + downvoted.TrueEquals((bool?) obj.downvoted) && + favorite_count.TrueEquals((int?) obj.favorite_count) && + favorited.TrueEquals((bool?) obj.favorited) && + is_answered.TrueEquals((bool?) obj.is_answered) && + last_activity_date.TrueEquals((DateTime?) obj.last_activity_date) && + last_edit_date.TrueEquals((DateTime?) obj.last_edit_date) && + (last_editor == null && obj.last_editor == null || last_editor.EqualsDynamic(obj.last_editor)) && + link.TrueEqualsString((string) obj.link) && + locked_date.TrueEquals((DateTime?) obj.locked_date) && + (migrated_from == null && obj.migrated_from == null || + migrated_from.EqualsDynamic(obj.migrated_from)) && + (migrated_to == null && obj.migrated_to == null || migrated_to.EqualsDynamic(obj.migrated_to)) && + (notice == null && obj.notice == null || notice.EqualsDynamic(obj.notice)) && + (owner == null && obj.owner == null || owner.EqualsDynamic(obj.owner)) && + protected_date.TrueEquals((DateTime?) obj.protected_date) && + question_id.TrueEquals((int?) obj.question_id) && + reopen_vote_count.TrueEquals((int?) obj.reopen_vote_count) && + score.TrueEquals((int?) obj.score) && + share_link.TrueEqualsString((string) obj.share_link) && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title.TrueEqualsString((string) obj.title) && + up_vote_count.TrueEquals((int?) obj.up_vote_count) && + upvoted.TrueEquals((bool?) obj.upvoted) && + view_count.TrueEquals((int?) obj.view_count); + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class ClosedDetails : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public bool? on_hold { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string reason { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string description { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public List by_users { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public List original_questions { get; set; } + + public bool Equals(ClosedDetails obj) + { + return + by_users.TrueEqualsList(obj.by_users) && + description.TrueEqualsString(obj.description) && + on_hold.TrueEquals(obj.on_hold) && + original_questions.TrueEqualsList(obj.original_questions) && + reason.TrueEqualsString(obj.reason); + } + + public bool EqualsDynamic(dynamic obj) + { + var oq = obj.original_questions; + var oqI = (IEnumerable) oq; + + return + by_users.TrueEqualsListDynamic((IEnumerable) obj.by_users) && + description.TrueEqualsString((string) obj.description) && + on_hold.TrueEquals((bool?) obj.on_hold) && + //this.original_questions.TrueEqualsListDynamic((IEnumerable)obj.original_questions) && + original_questions.TrueEqualsListDynamic(oqI) && + reason.TrueEqualsString((string) obj.reason); + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class OriginalQuestion : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? accepted_answer_id { get; set; } + + public bool Equals(OriginalQuestion obj) + { + return + accepted_answer_id.TrueEquals(obj.accepted_answer_id) && + answer_count.TrueEquals(obj.answer_count) && + question_id.TrueEquals(obj.question_id) && + title.TrueEqualsString(obj.title); + } + + public bool EqualsDynamic(dynamic obj) + { + return + accepted_answer_id.TrueEquals((int?) obj.accepted_answer_id) && + answer_count.TrueEquals((int?) obj.answer_count) && + question_id.TrueEquals((int?) obj.question_id) && + title.TrueEqualsString((string) obj.title); + } + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Notice : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? owner_user_id { get; set; } + + public bool Equals(Notice obj) + { + return + body.TrueEqualsString(obj.body) && + creation_date.TrueEquals(obj.creation_date) && + owner_user_id.TrueEquals(obj.owner_user_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + body.TrueEqualsString((string) obj.body) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + owner_user_id.TrueEquals((int?) obj.owner_user_id); + } + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class MigrationInfo : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public Info.Site other_site { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? on_date { get; set; } + + public bool Equals(MigrationInfo obj) + { + return + on_date.TrueEquals(obj.on_date) && + other_site.TrueEquals(obj.other_site) && + question_id.TrueEquals(obj.question_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + on_date.TrueEquals((DateTime?) obj.on_date) && + (other_site == null && obj.other_site == null || other_site.EqualsDynamic(obj.other_site)) && + question_id.TrueEquals((int?) obj.question_id); + } + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/QuestionTimeline.cs b/benchmark/SerializerBenchmark/Models/QuestionTimeline.cs new file mode 100644 index 000000000..186d5a1e1 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/QuestionTimeline.cs @@ -0,0 +1,83 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum QuestionTimelineAction : byte + { + question = 1, + answer = 2, + comment = 3, + unaccepted_answer = 4, + accepted_answer = 5, + vote_aggregate = 6, + revision = 7, + post_state_changed = 8 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class QuestionTimeline : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public QuestionTimelineAction? timeline_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? comment_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string revision_guid { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? up_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? down_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public ShallowUser user { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public ShallowUser owner { get; set; } + + public bool Equals(QuestionTimeline obj) + { + return + comment_id.TrueEquals(obj.comment_id) && + creation_date.TrueEquals(obj.creation_date) && + down_vote_count.TrueEquals(obj.down_vote_count) && + owner.TrueEquals(obj.owner) && + post_id.TrueEquals(obj.post_id) && + question_id.TrueEquals(obj.question_id) && + revision_guid.TrueEqualsString(obj.revision_guid) && + timeline_type.TrueEquals(obj.timeline_type) && + up_vote_count.TrueEquals(obj.up_vote_count) && + user.TrueEquals(obj.user); + } + + public bool EqualsDynamic(dynamic obj) + { + return + comment_id.TrueEquals((int?) obj.comment_id) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + down_vote_count.TrueEquals((int?) obj.down_vote_count) && + (owner == null && obj.owner == null || owner.EqualsDynamic(obj.owner)) && + post_id.TrueEquals((int?) obj.post_id) && + question_id.TrueEquals((int?) obj.question_id) && + revision_guid.TrueEqualsString((string) obj.revision_guid) && + timeline_type.TrueEquals((QuestionTimelineAction?) obj.timeline_type) && + up_vote_count.TrueEquals((int?) obj.up_vote_count) && + (user == null && obj.user == null || user.EqualsDynamic(obj.user)); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Reputation.cs b/benchmark/SerializerBenchmark/Models/Reputation.cs new file mode 100644 index 000000000..8b00d8dd6 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Reputation.cs @@ -0,0 +1,72 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum VoteType : byte + { + up_votes = 2, + down_votes = 3, + spam = 12, + accepts = 1, + bounties_won = 9, + bounties_offered = 8, + suggested_edits = 16 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Reputation : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public PostType? post_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public VoteType? vote_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? reputation_change { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public DateTime? on_date { get; set; } + + public bool Equals(Reputation obj) + { + return + link.TrueEqualsString(obj.link) && + on_date.TrueEquals(obj.on_date) && + post_id.TrueEquals(obj.post_id) && + post_type.TrueEquals(obj.post_type) && + reputation_change.TrueEquals(obj.reputation_change) && + title.TrueEqualsString(obj.title) && + user_id.TrueEquals(obj.user_id) && + vote_type.TrueEquals(obj.vote_type); + } + + public bool EqualsDynamic(dynamic obj) + { + return + link.TrueEqualsString((string) obj.link) && + on_date.TrueEquals((DateTime?) obj.on_date) && + post_id.TrueEquals((int?) obj.post_id) && + post_type.TrueEquals((PostType?) obj.post_type) && + reputation_change.TrueEquals((int?) obj.reputation_change) && + title.TrueEqualsString((string) obj.title) && + user_id.TrueEquals((int?) obj.user_id) && + vote_type.TrueEquals((VoteType?) obj.vote_type); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/ReputationHistory.cs b/benchmark/SerializerBenchmark/Models/ReputationHistory.cs new file mode 100644 index 000000000..9f57aa018 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/ReputationHistory.cs @@ -0,0 +1,83 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class ReputationHistory : IGenericEquality + { + public enum ReputationHistoryType : byte + { + asker_accepts_answer = 1, + asker_unaccept_answer = 2, + answer_accepted = 3, + answer_unaccepted = 4, + + voter_downvotes = 5, + voter_undownvotes = 6, + post_downvoted = 7, + post_undownvoted = 8, + + post_upvoted = 9, + post_unupvoted = 10, + + suggested_edit_approval_received = 11, + + post_flagged_as_spam = 12, + post_flagged_as_offensive = 13, + + bounty_given = 14, + bounty_earned = 15, + bounty_cancelled = 16, + + post_deleted = 17, + post_undeleted = 18, + + association_bonus = 19, + arbitrary_reputation_change = 20, + + vote_fraud_reversal = 21, + + post_migrated = 22, + + user_deleted = 23 + } + + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? reputation_change { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public ReputationHistoryType? reputation_history_type { get; set; } + + public bool Equals(ReputationHistory obj) + { + return + creation_date.TrueEquals(obj.creation_date) && + post_id.TrueEquals(obj.post_id) && + reputation_change.TrueEquals(obj.reputation_change) && + reputation_history_type.TrueEquals(obj.reputation_history_type) && + user_id.TrueEquals(obj.user_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + creation_date.TrueEquals((DateTime?) obj.creation_date) && + post_id.TrueEquals((int?) obj.post_id) && + reputation_change.TrueEquals((int?) obj.reputation_change) && + reputation_history_type.TrueEquals((ReputationHistoryType?) obj.reputation_history_type) && + user_id.TrueEquals((int?) obj.user_id); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Revision.cs b/benchmark/SerializerBenchmark/Models/Revision.cs new file mode 100644 index 000000000..f4d62d34e --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Revision.cs @@ -0,0 +1,108 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum RevisionType : byte + { + single_user = 1, + vote_based = 2 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Revision : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string revision_guid { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? revision_number { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public RevisionType? revision_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public PostType? post_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public string comment { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public bool? is_rollback { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public string last_body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public string last_title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public List last_tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public bool? set_community_wiki { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public ShallowUser user { get; set; } + + public bool Equals(Revision obj) + { + return + body.TrueEqualsString(obj.body) && + comment.TrueEqualsString(obj.comment) && + creation_date.TrueEquals(obj.creation_date) && + is_rollback.TrueEquals(obj.is_rollback) && + last_body.TrueEqualsString(obj.last_body) && + last_tags.TrueEqualsString(obj.last_tags) && + last_title.TrueEqualsString(obj.last_title) && + post_id.TrueEquals(obj.post_id) && + post_type.TrueEquals(obj.post_type) && + revision_guid.TrueEqualsString(obj.revision_guid) && + revision_number.TrueEquals(obj.revision_number) && + revision_type.TrueEquals(obj.revision_type) && + set_community_wiki.TrueEquals(obj.set_community_wiki) && + tags.TrueEqualsString(obj.tags) && + title.TrueEqualsString(obj.title) && + user.TrueEquals(obj.user); + } + + public bool EqualsDynamic(dynamic obj) + { + return + body.TrueEqualsString((string) obj.body) && + comment.TrueEqualsString((string) obj.comment) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + is_rollback.TrueEquals((bool?) obj.is_rollback) && + last_body.TrueEqualsString((string) obj.last_body) && + last_tags.TrueEqualsString((IEnumerable) obj.last_tags) && + last_title.TrueEqualsString((string) obj.last_title) && + post_id.TrueEquals((int?) obj.post_id) && + post_type.TrueEquals((PostType?) obj.post_type) && + revision_guid.TrueEqualsString((string) obj.revision_guid) && + revision_number.TrueEquals((int?) obj.revision_number) && + revision_type.TrueEquals((RevisionType?) obj.revision_type) && + set_community_wiki.TrueEquals((bool?) obj.set_community_wiki) && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title.TrueEqualsString((string) obj.title) && + (user == null && obj.user == null || user.EqualsDynamic(obj.user)); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/SearchExcerpt.cs b/benchmark/SerializerBenchmark/Models/SearchExcerpt.cs new file mode 100644 index 000000000..85912ba5e --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/SearchExcerpt.cs @@ -0,0 +1,119 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum SearchExcerptItemType : byte + { + question = 1, + answer = 2 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class SearchExcerpt : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string excerpt { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? community_owned_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public DateTime? locked_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public DateTime? last_activity_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public ShallowUser owner { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public ShallowUser last_activity_user { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public SearchExcerptItemType? item_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public int? question_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public bool? is_answered { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public DateTime? closed_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(17), oldmsgpack::MessagePack.Key(17 - 1), newmsgpack::MessagePack.Key(17 - 1)] + public int? answer_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(18), oldmsgpack::MessagePack.Key(18 - 1), newmsgpack::MessagePack.Key(18 - 1)] + public bool? is_accepted { get; set; } + + public bool Equals(SearchExcerpt obj) + { + return + answer_count.TrueEquals(obj.answer_count) && + answer_id.TrueEquals(obj.answer_id) && + body.TrueEqualsString(obj.body) && + closed_date.TrueEquals(obj.closed_date) && + community_owned_date.TrueEquals(obj.community_owned_date) && + creation_date.TrueEquals(obj.creation_date) && + excerpt.TrueEqualsString(obj.excerpt) && + is_accepted.TrueEquals(obj.is_accepted) && + is_answered.TrueEquals(obj.is_answered) && + item_type.TrueEquals(obj.item_type) && + last_activity_date.TrueEquals(obj.last_activity_date) && + last_activity_user.TrueEquals(obj.last_activity_user) && + locked_date.TrueEquals(obj.locked_date) && + owner.TrueEquals(obj.owner) && + question_id.TrueEquals(obj.question_id) && + score.TrueEquals(obj.score) && + tags.TrueEqualsString(obj.tags) && + title.TrueEqualsString(obj.title); + } + + public bool EqualsDynamic(dynamic obj) + { + return + answer_count.TrueEquals((int?) obj.answer_count) && + answer_id.TrueEquals((int?) obj.answer_id) && + body.TrueEqualsString((string) obj.body) && + closed_date.TrueEquals((DateTime?) obj.closed_date) && + community_owned_date.TrueEquals((DateTime?) obj.community_owned_date) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + excerpt.TrueEqualsString((string) obj.excerpt) && + is_accepted.TrueEquals((bool?) obj.is_accepted) && + is_answered.TrueEquals((bool?) obj.is_answered) && + item_type.TrueEquals((SearchExcerptItemType?) obj.item_type) && + last_activity_date.TrueEquals((DateTime?) obj.last_activity_date) && + (last_activity_user == null && obj.last_activity_user == null || + last_activity_user.EqualsDynamic(obj.last_activity_user)) && + locked_date.TrueEquals((DateTime?) obj.locked_date) && + (owner == null && obj.owner == null || owner.EqualsDynamic(obj.owner)) && + question_id.TrueEquals((int?) obj.question_id) && + score.TrueEquals((int?) obj.score) && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title.TrueEqualsString((string) obj.title); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/ShallowUser.cs b/benchmark/SerializerBenchmark/Models/ShallowUser.cs new file mode 100644 index 000000000..2a5da846b --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/ShallowUser.cs @@ -0,0 +1,68 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum UserType : byte + { + unregistered = 2, + registered = 3, + moderator = 4, + does_not_exist = 255 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class ShallowUser : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string display_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? reputation { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public UserType? user_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string profile_image { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? accept_rate { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public User.BadgeCount badge_counts { get; set; } + + public bool Equals(ShallowUser obj) + { + return + accept_rate.TrueEquals(obj.accept_rate) && + badge_counts.TrueEquals(obj.badge_counts) && + display_name.TrueEqualsString(obj.display_name) && + link.TrueEqualsString(obj.link) && + profile_image.TrueEqualsString(obj.profile_image) && + reputation.TrueEquals(obj.reputation) && + user_id.TrueEquals(obj.user_id) && + user_type.TrueEquals(obj.user_type); + } + + public bool EqualsDynamic(dynamic obj) + { + return + accept_rate.TrueEquals((int?) obj.accept_rate) && + (badge_counts == null && obj.badge_counts == null || badge_counts.EqualsDynamic(obj.badge_counts)) && + display_name.TrueEqualsString((string) obj.display_name) && + link.TrueEqualsString((string) obj.link) && + profile_image.TrueEqualsString((string) obj.profile_image) && + reputation.TrueEquals((int?) obj.reputation) && + user_id.TrueEquals((int?) obj.user_id) && + user_type.TrueEquals((UserType?) obj.user_type); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/SuggestedEdit.cs b/benchmark/SerializerBenchmark/Models/SuggestedEdit.cs new file mode 100644 index 000000000..79e6bac4a --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/SuggestedEdit.cs @@ -0,0 +1,78 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class SuggestedEdit : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? suggested_edit_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public PostType? post_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public List tags { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public string comment { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public DateTime? approval_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public DateTime? rejection_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public ShallowUser proposing_user { get; set; } + + public bool Equals(SuggestedEdit obj) + { + return + approval_date.TrueEquals(obj.approval_date) && + body.TrueEqualsString(obj.body) && + comment.TrueEqualsString(obj.comment) && + creation_date.TrueEquals(obj.creation_date) && + post_id.TrueEquals(obj.post_id) && + post_type.TrueEquals(obj.post_type) && + proposing_user.TrueEquals(obj.proposing_user) && + rejection_date.TrueEquals(obj.rejection_date) && + suggested_edit_id.TrueEquals(obj.suggested_edit_id) && + tags.TrueEqualsString(obj.tags) && + title.TrueEqualsString(obj.title); + } + + public bool EqualsDynamic(dynamic obj) + { + return + approval_date.TrueEquals((DateTime?) obj.approval_date) && + body.TrueEqualsString((string) obj.body) && + comment.TrueEqualsString((string) obj.comment) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + post_id.TrueEquals((int?) obj.post_id) && + post_type.TrueEquals((PostType?) obj.post_type) && + (proposing_user == null && obj.proposing_user == null || + proposing_user.EqualsDynamic(obj.proposing_user)) && + rejection_date.TrueEquals((DateTime?) obj.rejection_date) && + suggested_edit_id.TrueEquals((int?) obj.suggested_edit_id) && + tags.TrueEqualsString((IEnumerable) obj.tags) && + title.TrueEqualsString((string) obj.title); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/Tag.cs b/benchmark/SerializerBenchmark/Models/Tag.cs new file mode 100644 index 000000000..9ac7fd290 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/Tag.cs @@ -0,0 +1,62 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using System.Collections.Generic; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class Tag : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public bool? is_required { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public bool? is_moderator_only { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public bool? has_synonyms { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public DateTime? last_activity_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public List synonyms { get; set; } + + public bool Equals(Tag obj) + { + return + count.TrueEquals(obj.count) && + has_synonyms.TrueEquals(obj.has_synonyms) && + is_moderator_only.TrueEquals(obj.is_moderator_only) && + is_required.TrueEquals(obj.is_required) && + last_activity_date.TrueEquals(obj.last_activity_date) && + name.TrueEqualsString(obj.name) && + synonyms.TrueEqualsString(obj.synonyms) && + user_id.TrueEquals(obj.user_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + count.TrueEquals((int?) obj.count) && + has_synonyms.TrueEquals((bool?) obj.has_synonyms) && + is_moderator_only.TrueEquals((bool?) obj.is_moderator_only) && + is_required.TrueEquals((bool?) obj.is_required) && + last_activity_date.TrueEquals((DateTime?) obj.last_activity_date) && + name.TrueEqualsString((string) obj.name) && + synonyms.TrueEqualsString((IEnumerable) obj.synonyms) && + user_id.TrueEquals((int?) obj.user_id); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/TagScore.cs b/benchmark/SerializerBenchmark/Models/TagScore.cs new file mode 100644 index 000000000..7aee2fc85 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/TagScore.cs @@ -0,0 +1,35 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class TagScore : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public ShallowUser user { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? post_count { get; set; } + + public bool Equals(TagScore obj) + { + return + post_count.TrueEquals(obj.post_count) && + score.TrueEquals(obj.score) && + user.TrueEquals(obj.user); + } + + public bool EqualsDynamic(dynamic obj) + { + return + post_count.TrueEquals((int?) obj.post_count) && + score.TrueEquals((int?) obj.score) && + (user == null && obj.user == null || user.EqualsDynamic(obj.user)); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/TagSynonym.cs b/benchmark/SerializerBenchmark/Models/TagSynonym.cs new file mode 100644 index 000000000..786d027ba --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/TagSynonym.cs @@ -0,0 +1,46 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class TagSynonym : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string from_tag { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string to_tag { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? applied_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public DateTime? last_applied_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public DateTime? creation_date { get; set; } + + public bool Equals(TagSynonym obj) + { + return + applied_count.TrueEquals(obj.applied_count) && + creation_date.TrueEquals(obj.creation_date) && + from_tag.TrueEqualsString(obj.from_tag) && + last_applied_date.TrueEquals(obj.last_applied_date) && + to_tag.TrueEqualsString(obj.to_tag); + } + + public bool EqualsDynamic(dynamic obj) + { + return + applied_count.TrueEquals((int?) obj.applied_count) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + from_tag.TrueEqualsString((string) obj.from_tag) && + last_applied_date.TrueEquals((DateTime?) obj.last_applied_date) && + to_tag.TrueEqualsString((string) obj.to_tag); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/TagWiki.cs b/benchmark/SerializerBenchmark/Models/TagWiki.cs new file mode 100644 index 000000000..d5804d143 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/TagWiki.cs @@ -0,0 +1,58 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class TagWiki : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string tag_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string body { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public string excerpt { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public DateTime? body_last_edit_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public DateTime? excerpt_last_edit_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public ShallowUser last_body_editor { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public ShallowUser last_excerpt_editor { get; set; } + + public bool Equals(TagWiki obj) + { + return + body.TrueEqualsString(obj.body) && + body_last_edit_date.TrueEquals(obj.body_last_edit_date) && + excerpt.TrueEqualsString(obj.excerpt) && + excerpt_last_edit_date.TrueEquals(obj.excerpt_last_edit_date) && + last_body_editor.TrueEquals(obj.last_body_editor) && + last_excerpt_editor.TrueEquals(obj.last_excerpt_editor) && + tag_name.TrueEqualsString(obj.tag_name); + } + + public bool EqualsDynamic(dynamic obj) + { + return + body.TrueEqualsString((string) obj.body) && + body_last_edit_date.TrueEquals((DateTime?) obj.body_last_edit_date) && + excerpt.TrueEqualsString((string) obj.excerpt) && + excerpt_last_edit_date.TrueEquals((DateTime?) obj.excerpt_last_edit_date) && + (last_body_editor == null && obj.last_body_editor == null || + last_body_editor.EqualsDynamic(obj.last_body_editor)) && + (last_excerpt_editor == null && obj.last_excerpt_editor == null || + last_excerpt_editor.EqualsDynamic(obj.last_excerpt_editor)) && + tag_name.TrueEqualsString((string) obj.tag_name); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/TopTag.cs b/benchmark/SerializerBenchmark/Models/TopTag.cs new file mode 100644 index 000000000..e8940a10f --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/TopTag.cs @@ -0,0 +1,50 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class TopTag : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public string tag_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? question_score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? question_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? answer_score { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? user_id { get; set; } + + public bool Equals(TopTag obj) + { + return + answer_count.TrueEquals(obj.answer_count) && + answer_score.TrueEquals(obj.answer_score) && + question_count.TrueEquals(obj.question_count) && + question_score.TrueEquals(obj.question_score) && + tag_name.TrueEqualsString(obj.tag_name) && + user_id.TrueEquals(obj.user_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + answer_count.TrueEquals((int?) obj.answer_count) && + answer_score.TrueEquals((int?) obj.answer_score) && + question_count.TrueEquals((int?) obj.question_count) && + question_score.TrueEquals((int?) obj.question_score) && + tag_name.TrueEqualsString((string) obj.tag_name) && + user_id.TrueEquals((int?) obj.user_id); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/User.cs b/benchmark/SerializerBenchmark/Models/User.cs new file mode 100644 index 000000000..b8bb8d42f --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/User.cs @@ -0,0 +1,190 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class User : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public UserType? user_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public string display_name { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public string profile_image { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? reputation { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? reputation_change_day { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public int? reputation_change_week { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public int? reputation_change_month { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public int? reputation_change_quarter { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public int? reputation_change_year { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(12), oldmsgpack::MessagePack.Key(12 - 1), newmsgpack::MessagePack.Key(12 - 1)] + public int? age { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(13), oldmsgpack::MessagePack.Key(13 - 1), newmsgpack::MessagePack.Key(13 - 1)] + public DateTime? last_access_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(14), oldmsgpack::MessagePack.Key(14 - 1), newmsgpack::MessagePack.Key(14 - 1)] + public DateTime? last_modified_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(15), oldmsgpack::MessagePack.Key(15 - 1), newmsgpack::MessagePack.Key(15 - 1)] + public bool? is_employee { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(16), oldmsgpack::MessagePack.Key(16 - 1), newmsgpack::MessagePack.Key(16 - 1)] + public string link { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(17), oldmsgpack::MessagePack.Key(17 - 1), newmsgpack::MessagePack.Key(17 - 1)] + public string website_url { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(18), oldmsgpack::MessagePack.Key(18 - 1), newmsgpack::MessagePack.Key(18 - 1)] + public string location { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(19), oldmsgpack::MessagePack.Key(19 - 1), newmsgpack::MessagePack.Key(19 - 1)] + public int? account_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(20), oldmsgpack::MessagePack.Key(20 - 1), newmsgpack::MessagePack.Key(20 - 1)] + public DateTime? timed_penalty_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(21), oldmsgpack::MessagePack.Key(21 - 1), newmsgpack::MessagePack.Key(21 - 1)] + public BadgeCount badge_counts { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(22), oldmsgpack::MessagePack.Key(22 - 1), newmsgpack::MessagePack.Key(22 - 1)] + public int? question_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(23), oldmsgpack::MessagePack.Key(23 - 1), newmsgpack::MessagePack.Key(23 - 1)] + public int? answer_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(24), oldmsgpack::MessagePack.Key(24 - 1), newmsgpack::MessagePack.Key(24 - 1)] + public int? up_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(25), oldmsgpack::MessagePack.Key(25 - 1), newmsgpack::MessagePack.Key(25 - 1)] + public int? down_vote_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(26), oldmsgpack::MessagePack.Key(26 - 1), newmsgpack::MessagePack.Key(26 - 1)] + public string about_me { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(27), oldmsgpack::MessagePack.Key(27 - 1), newmsgpack::MessagePack.Key(27 - 1)] + public int? view_count { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(28), oldmsgpack::MessagePack.Key(28 - 1), newmsgpack::MessagePack.Key(28 - 1)] + public int? accept_rate { get; set; } + + public bool Equals(User obj) + { + return + about_me.TrueEqualsString(obj.about_me) && + accept_rate.TrueEquals(obj.accept_rate) && + account_id.TrueEquals(obj.account_id) && + age.TrueEquals(obj.age) && + answer_count.TrueEquals(obj.answer_count) && + badge_counts.TrueEquals(obj.badge_counts) && + creation_date.TrueEquals(obj.creation_date) && + display_name.TrueEqualsString(obj.display_name) && + down_vote_count.TrueEquals(obj.down_vote_count) && + is_employee.TrueEquals(obj.is_employee) && + last_access_date.TrueEquals(obj.last_access_date) && + last_modified_date.TrueEquals(obj.last_modified_date) && + link.TrueEqualsString(obj.link) && + location.TrueEqualsString(obj.location) && + profile_image.TrueEqualsString(obj.profile_image) && + question_count.TrueEquals(obj.question_count) && + reputation.TrueEquals(obj.reputation) && + reputation_change_day.TrueEquals(obj.reputation_change_day) && + reputation_change_month.TrueEquals(obj.reputation_change_month) && + reputation_change_quarter.TrueEquals(obj.reputation_change_quarter) && + reputation_change_week.TrueEquals(obj.reputation_change_week) && + reputation_change_year.TrueEquals(obj.reputation_change_year) && + timed_penalty_date.TrueEquals(obj.timed_penalty_date) && + up_vote_count.TrueEquals(obj.up_vote_count) && + user_id.TrueEquals(obj.user_id) && + user_type.TrueEquals(obj.user_type) && + view_count.TrueEquals(obj.view_count) && + website_url.TrueEqualsString(obj.website_url); + } + + public bool EqualsDynamic(dynamic obj) + { + return + about_me.TrueEqualsString((string) obj.about_me) && + accept_rate.TrueEquals((int?) obj.accept_rate) && + account_id.TrueEquals((int?) obj.account_id) && + age.TrueEquals((int?) obj.age) && + answer_count.TrueEquals((int?) obj.answer_count) && + (badge_counts == null && obj.badge_counts == null || badge_counts.EqualsDynamic(obj.badge_counts)) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + display_name.TrueEqualsString((string) obj.display_name) && + down_vote_count.TrueEquals((int?) obj.down_vote_count) && + is_employee.TrueEquals((bool?) obj.is_employee) && + last_access_date.TrueEquals((DateTime?) obj.last_access_date) && + last_modified_date.TrueEquals((DateTime?) obj.last_modified_date) && + link.TrueEqualsString((string) obj.link) && + location.TrueEqualsString((string) obj.location) && + profile_image.TrueEqualsString((string) obj.profile_image) && + question_count.TrueEquals((int?) obj.question_count) && + reputation.TrueEquals((int?) obj.reputation) && + reputation_change_day.TrueEquals((int?) obj.reputation_change_day) && + reputation_change_month.TrueEquals((int?) obj.reputation_change_month) && + reputation_change_quarter.TrueEquals((int?) obj.reputation_change_quarter) && + reputation_change_week.TrueEquals((int?) obj.reputation_change_week) && + reputation_change_year.TrueEquals((int?) obj.reputation_change_year) && + timed_penalty_date.TrueEquals((DateTime?) obj.timed_penalty_date) && + up_vote_count.TrueEquals((int?) obj.up_vote_count) && + user_id.TrueEquals((int?) obj.user_id) && + user_type.TrueEquals((UserType?) obj.user_type) && + view_count.TrueEquals((int?) obj.view_count) && + website_url.TrueEqualsString((string) obj.website_url); + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class BadgeCount : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? gold { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public int? silver { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public int? bronze { get; set; } + + public bool Equals(BadgeCount obj) + { + return + bronze.TrueEquals(obj.bronze) && + silver.TrueEquals(obj.silver) && + gold.TrueEquals(obj.gold); + } + + public bool EqualsDynamic(dynamic obj) + { + return + bronze.TrueEquals((int?) obj.bronze) && + silver.TrueEquals((int?) obj.silver) && + gold.TrueEquals((int?) obj.gold); + } + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/UserTimeline.cs b/benchmark/SerializerBenchmark/Models/UserTimeline.cs new file mode 100644 index 000000000..d973c64b4 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/UserTimeline.cs @@ -0,0 +1,88 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using System; +using ProtoBuf; + +namespace Benchmark.Models +{ + public enum UserTimelineType : byte + { + commented = 1, + asked = 2, + answered = 3, + badge = 4, + revision = 5, + accepted = 6, + reviewed = 7, + suggested = 8 + } + + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class UserTimeline : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public DateTime? creation_date { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public PostType? post_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public UserTimelineType? timeline_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public int? post_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? comment_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? suggested_edit_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(8), oldmsgpack::MessagePack.Key(8 - 1), newmsgpack::MessagePack.Key(8 - 1)] + public int? badge_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(9), oldmsgpack::MessagePack.Key(9 - 1), newmsgpack::MessagePack.Key(9 - 1)] + public string title { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(10), oldmsgpack::MessagePack.Key(10 - 1), newmsgpack::MessagePack.Key(10 - 1)] + public string detail { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(11), oldmsgpack::MessagePack.Key(11 - 1), newmsgpack::MessagePack.Key(11 - 1)] + public string link { get; set; } + + public bool Equals(UserTimeline obj) + { + return + badge_id.TrueEquals(obj.badge_id) && + comment_id.TrueEquals(obj.comment_id) && + creation_date.TrueEquals(obj.creation_date) && + detail.TrueEqualsString(obj.detail) && + link.TrueEqualsString(obj.link) && + post_id.TrueEquals(obj.post_id) && + post_type.TrueEquals(obj.post_type) && + suggested_edit_id.TrueEquals(obj.suggested_edit_id) && + timeline_type.TrueEquals(obj.timeline_type) && + title.TrueEqualsString(obj.title) && + user_id.TrueEquals(obj.user_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + badge_id.TrueEquals((int?) obj.badge_id) && + comment_id.TrueEquals((int?) obj.comment_id) && + creation_date.TrueEquals((DateTime?) obj.creation_date) && + detail.TrueEqualsString((string) obj.detail) && + link.TrueEqualsString((string) obj.link) && + post_id.TrueEquals((int?) obj.post_id) && + post_type.TrueEquals((PostType?) obj.post_type) && + suggested_edit_id.TrueEquals((int?) obj.suggested_edit_id) && + timeline_type.TrueEquals((UserTimelineType?) obj.timeline_type) && + title.TrueEqualsString((string) obj.title) && + user_id.TrueEquals((int?) obj.user_id); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Models/WritePermission.cs b/benchmark/SerializerBenchmark/Models/WritePermission.cs new file mode 100644 index 000000000..7799a32d0 --- /dev/null +++ b/benchmark/SerializerBenchmark/Models/WritePermission.cs @@ -0,0 +1,55 @@ +extern alias oldmsgpack; +extern alias newmsgpack; +using ProtoBuf; + +namespace Benchmark.Models +{ + [ProtoContract, System.Serializable, System.Runtime.Serialization.DataContract, oldmsgpack::MessagePack.MessagePackObject, newmsgpack::MessagePack.MessagePackObject] + public class WritePermission : IGenericEquality + { + [System.Runtime.Serialization.DataMember(), ProtoMember(1), oldmsgpack::MessagePack.Key(1 - 1), newmsgpack::MessagePack.Key(1 - 1)] + public int? user_id { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(2), oldmsgpack::MessagePack.Key(2 - 1), newmsgpack::MessagePack.Key(2 - 1)] + public string object_type { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(3), oldmsgpack::MessagePack.Key(3 - 1), newmsgpack::MessagePack.Key(3 - 1)] + public bool? can_add { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(4), oldmsgpack::MessagePack.Key(4 - 1), newmsgpack::MessagePack.Key(4 - 1)] + public bool? can_edit { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(5), oldmsgpack::MessagePack.Key(5 - 1), newmsgpack::MessagePack.Key(5 - 1)] + public bool? can_delete { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(6), oldmsgpack::MessagePack.Key(6 - 1), newmsgpack::MessagePack.Key(6 - 1)] + public int? max_daily_actions { get; set; } + + [System.Runtime.Serialization.DataMember(), ProtoMember(7), oldmsgpack::MessagePack.Key(7 - 1), newmsgpack::MessagePack.Key(7 - 1)] + public int? min_seconds_between_actions { get; set; } + + public bool Equals(WritePermission obj) + { + return + can_add.TrueEquals(obj.can_add) && + can_delete.TrueEquals(obj.can_delete) && + can_edit.TrueEquals(obj.can_edit) && + max_daily_actions.TrueEquals(obj.max_daily_actions) && + min_seconds_between_actions.TrueEquals(obj.min_seconds_between_actions) && + object_type.TrueEqualsString(obj.object_type) && + user_id.TrueEquals(obj.user_id); + } + + public bool EqualsDynamic(dynamic obj) + { + return + can_add.TrueEquals((bool?) obj.can_add) && + can_delete.TrueEquals((bool?) obj.can_delete) && + can_edit.TrueEquals((bool?) obj.can_edit) && + max_daily_actions.TrueEquals((int?) obj.max_daily_actions) && + min_seconds_between_actions.TrueEquals((int?) obj.min_seconds_between_actions) && + object_type.TrueEqualsString((string) obj.object_type) && + user_id.TrueEquals((int?) obj.user_id); + } + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Program.cs b/benchmark/SerializerBenchmark/Program.cs new file mode 100644 index 000000000..73b95297e --- /dev/null +++ b/benchmark/SerializerBenchmark/Program.cs @@ -0,0 +1,13 @@ +using Benchmark; +using BenchmarkDotNet.Running; + +namespace ConsoleApp1 +{ + class Program + { + static void Main(string[] args) + { + BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); + } + } +} diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.cs b/benchmark/SerializerBenchmark/SerializerBenchmark.cs new file mode 100644 index 000000000..8f1a7f036 --- /dev/null +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.cs @@ -0,0 +1,953 @@ +namespace Benchmark +{ + using Benchmark.Fixture; + using Benchmark.Models; + using Benchmark.Serializers; + using BenchmarkDotNet.Attributes; + using System; + using System.Collections.Generic; + + [Config(typeof(BenchmarkConfig))] + public class AllSerializerBenchmark_BytesInOut + { + [ParamsSource(nameof(Serializers))] + public SerializerBase Serializer; + + // Currently BenchmarkdDotNet does not detect inherited ParamsSource so use copy and paste:) + + public IEnumerable Serializers => new SerializerBase[] + { + new MsgPack_v1(), + new MsgPack_v2(), + new MsgPackLz4_v1(), + new MsgPackLz4_v2(), + new Protobuf(), + new JsonNet(), + new BinaryFormatter_(), + new DataContract_(), + new Hyperion_(), + new Jil_(), + new SpanJson_(), + new Utf8Json_(), + new MsgPackCli(), + new FsPickler_() + }; + + protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); + + // primitives + + protected static readonly sbyte SByteInput = ExpressionTreeFixture.Create(); + protected static readonly short ShortInput = ExpressionTreeFixture.Create(); + protected static readonly int IntInput = ExpressionTreeFixture.Create(); + protected static readonly long LongInput = ExpressionTreeFixture.Create(); + protected static readonly byte ByteInput = ExpressionTreeFixture.Create(); + protected static readonly ushort UShortInput = ExpressionTreeFixture.Create(); + protected static readonly uint UIntInput = ExpressionTreeFixture.Create(); + protected static readonly ulong ULongInput = ExpressionTreeFixture.Create(); + protected static readonly bool BoolInput = ExpressionTreeFixture.Create(); + protected static readonly string StringInput = ExpressionTreeFixture.Create(); + protected static readonly char CharInput = ExpressionTreeFixture.Create(); + protected static readonly DateTime DateTimeInput = ExpressionTreeFixture.Create(); + protected static readonly Guid GuidInput = ExpressionTreeFixture.Create(); + protected static readonly byte[] BytesInput = ExpressionTreeFixture.Create(); + + // models + + protected static readonly Benchmark.Models.AccessToken AccessTokenInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.AccountMerge AccountMergeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Answer AnswerInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Badge BadgeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Comment CommentInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Error ErrorInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Event EventInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileFeed MobileFeedInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileQuestion MobileQuestionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileRepChange MobileRepChangeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileInboxItem MobileInboxItemInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileBadgeAward MobileBadgeAwardInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobilePrivilege MobilePrivilegeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileCommunityBulletin MobileCommunityBulletinInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileAssociationBonus MobileAssociationBonusInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileCareersJobAd MobileCareersJobAdInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileBannerAd MobileBannerAdInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileUpdateNotice MobileUpdateNoticeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.FlagOption FlagOptionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.InboxItem InboxItemInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info InfoInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.NetworkUser NetworkUserInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Notification NotificationInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Post PostInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Privilege PrivilegeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question QuestionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.QuestionTimeline QuestionTimelineInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Reputation ReputationInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.ReputationHistory ReputationHistoryInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Revision RevisionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.SearchExcerpt SearchExcerptInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.ShallowUser ShallowUserInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.SuggestedEdit SuggestedEditInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Tag TagInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TagScore TagScoreInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TagSynonym TagSynonymInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TagWiki TagWikiInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TopTag TopTagInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.User UserInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.UserTimeline UserTimelineInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.WritePermission WritePermissionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileBannerAd.MobileBannerAdImage MobileBannerAdImageInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info.Site SiteInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info.RelatedSite RelatedSiteInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.ClosedDetails ClosedDetailsInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.Notice NoticeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.MigrationInfo MigrationInfoInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.User.BadgeCount BadgeCountInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info.Site.Styling StylingInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.ClosedDetails.OriginalQuestion OriginalQuestionInput = ExpressionTreeFixture.Create(); + + object SByteOutput; + object ShortOutput; + object IntOutput; + object LongOutput; + object ByteOutput; + object UShortOutput; + object UIntOutput; + object ULongOutput; + object BoolOutput; + object StringOutput; + object CharOutput; + object DateTimeOutput; + object GuidOutput; + object BytesOutput; + + object AccessTokenOutput; + object AccountMergeOutput; + object AnswerOutput; + object BadgeOutput; + object CommentOutput; + object ErrorOutput; + object EventOutput; + object MobileFeedOutput; + object MobileQuestionOutput; + object MobileRepChangeOutput; + object MobileInboxItemOutput; + object MobileBadgeAwardOutput; + object MobilePrivilegeOutput; + object MobileCommunityBulletinOutput; + object MobileAssociationBonusOutput; + object MobileCareersJobAdOutput; + object MobileBannerAdOutput; + object MobileUpdateNoticeOutput; + object FlagOptionOutput; + object InboxItemOutput; + object InfoOutput; + object NetworkUserOutput; + object NotificationOutput; + object PostOutput; + object PrivilegeOutput; + object QuestionOutput; + object QuestionTimelineOutput; + object ReputationOutput; + object ReputationHistoryOutput; + object RevisionOutput; + object SearchExcerptOutput; + object ShallowUserOutput; + object SuggestedEditOutput; + object TagOutput; + object TagScoreOutput; + object TagSynonymOutput; + object TagWikiOutput; + object TopTagOutput; + object UserOutput; + object UserTimelineOutput; + object WritePermissionOutput; + object MobileBannerAdImageOutput; + object SiteOutput; + object RelatedSiteOutput; + object ClosedDetailsOutput; + object NoticeOutput; + object MigrationInfoOutput; + object BadgeCountOutput; + object StylingOutput; + object OriginalQuestionOutput; + + [GlobalSetup] + public void Setup() + { + // primitives + SByteOutput = Serializer.Serialize(SByteInput); + ShortOutput = Serializer.Serialize(ShortInput); + IntOutput = Serializer.Serialize(IntInput); + LongOutput = Serializer.Serialize(LongInput); + ByteOutput = Serializer.Serialize(ByteInput); + UShortOutput = Serializer.Serialize(UShortInput); + UIntOutput = Serializer.Serialize(UIntInput); + ULongOutput = Serializer.Serialize(ULongInput); + BoolOutput = Serializer.Serialize(BoolInput); + StringOutput = Serializer.Serialize(StringInput); + CharOutput = Serializer.Serialize(CharInput); + DateTimeOutput = Serializer.Serialize(DateTimeInput); + GuidOutput = Serializer.Serialize(GuidInput); + BytesOutput = Serializer.Serialize(BytesInput); + + // models + AccessTokenOutput = Serializer.Serialize(AccessTokenInput); + AccountMergeOutput = Serializer.Serialize(AccountMergeInput); + AnswerOutput = Serializer.Serialize(AnswerInput); + BadgeOutput = Serializer.Serialize(BadgeInput); + CommentOutput = Serializer.Serialize(CommentInput); + ErrorOutput = Serializer.Serialize(ErrorInput); + EventOutput = Serializer.Serialize(EventInput); + MobileFeedOutput = Serializer.Serialize(MobileFeedInput); + MobileQuestionOutput = Serializer.Serialize(MobileQuestionInput); + MobileRepChangeOutput = Serializer.Serialize(MobileRepChangeInput); + MobileInboxItemOutput = Serializer.Serialize(MobileInboxItemInput); + MobileBadgeAwardOutput = Serializer.Serialize(MobileBadgeAwardInput); + MobilePrivilegeOutput = Serializer.Serialize(MobilePrivilegeInput); + MobileCommunityBulletinOutput = Serializer.Serialize(MobileCommunityBulletinInput); + MobileAssociationBonusOutput = Serializer.Serialize(MobileAssociationBonusInput); + MobileCareersJobAdOutput = Serializer.Serialize(MobileCareersJobAdInput); + MobileBannerAdOutput = Serializer.Serialize(MobileBannerAdInput); + MobileUpdateNoticeOutput = Serializer.Serialize(MobileUpdateNoticeInput); + FlagOptionOutput = Serializer.Serialize(FlagOptionInput); + InboxItemOutput = Serializer.Serialize(InboxItemInput); + InfoOutput = Serializer.Serialize(InfoInput); + NetworkUserOutput = Serializer.Serialize(NetworkUserInput); + NotificationOutput = Serializer.Serialize(NotificationInput); + PostOutput = Serializer.Serialize(PostInput); + PrivilegeOutput = Serializer.Serialize(PrivilegeInput); + QuestionOutput = Serializer.Serialize(QuestionInput); + QuestionTimelineOutput = Serializer.Serialize(QuestionTimelineInput); + ReputationOutput = Serializer.Serialize(ReputationInput); + ReputationHistoryOutput = Serializer.Serialize(ReputationHistoryInput); + RevisionOutput = Serializer.Serialize(RevisionInput); + SearchExcerptOutput = Serializer.Serialize(SearchExcerptInput); + ShallowUserOutput = Serializer.Serialize(ShallowUserInput); + SuggestedEditOutput = Serializer.Serialize(SuggestedEditInput); + TagOutput = Serializer.Serialize(TagInput); + TagScoreOutput = Serializer.Serialize(TagScoreInput); + TagSynonymOutput = Serializer.Serialize(TagSynonymInput); + TagWikiOutput = Serializer.Serialize(TagWikiInput); + TopTagOutput = Serializer.Serialize(TopTagInput); + UserOutput = Serializer.Serialize(UserInput); + UserTimelineOutput = Serializer.Serialize(UserTimelineInput); + WritePermissionOutput = Serializer.Serialize(WritePermissionInput); + MobileBannerAdImageOutput = Serializer.Serialize(MobileBannerAdImageInput); + SiteOutput = Serializer.Serialize(SiteInput); + RelatedSiteOutput = Serializer.Serialize(RelatedSiteInput); + ClosedDetailsOutput = Serializer.Serialize(ClosedDetailsInput); + NoticeOutput = Serializer.Serialize(NoticeInput); + MigrationInfoOutput = Serializer.Serialize(MigrationInfoInput); + BadgeCountOutput = Serializer.Serialize(BadgeCountInput); + StylingOutput = Serializer.Serialize(StylingInput); + OriginalQuestionOutput = Serializer.Serialize(OriginalQuestionInput); + } + + // Serialize + + [Benchmark] public object _PrimitiveSByteSerialize() => Serializer.Serialize(SByteInput); + [Benchmark] public object _PrimitiveShortSerialize() => Serializer.Serialize(ShortInput); + [Benchmark] public object _PrimitiveIntSerialize() => Serializer.Serialize(IntInput); + [Benchmark] public object _PrimitiveLongSerialize() => Serializer.Serialize(LongInput); + [Benchmark] public object _PrimitiveByteSerialize() => Serializer.Serialize(ByteInput); + [Benchmark] public object _PrimitiveUShortSerialize() => Serializer.Serialize(UShortInput); + [Benchmark] public object _PrimitiveUIntSerialize() => Serializer.Serialize(UIntInput); + [Benchmark] public object _PrimitiveULongSerialize() => Serializer.Serialize(ULongInput); + [Benchmark] public object _PrimitiveBoolSerialize() => Serializer.Serialize(BoolInput); + [Benchmark] public object _PrimitiveStringSerialize() => Serializer.Serialize(StringInput); + [Benchmark] public object _PrimitiveCharSerialize() => Serializer.Serialize(CharInput); + [Benchmark] public object _PrimitiveDateTimeSerialize() => Serializer.Serialize(DateTimeInput); + [Benchmark] public object _PrimitiveGuidSerialize() => Serializer.Serialize(GuidInput); + [Benchmark] public object _PrimitiveBytesSerialize() => Serializer.Serialize(BytesInput); + + [Benchmark] public object AccessTokenSerialize() => Serializer.Serialize(AccessTokenInput); + [Benchmark] public object AccountMergeSerialize() => Serializer.Serialize(AccountMergeInput); + [Benchmark] public object AnswerSerialize() => Serializer.Serialize(AnswerInput); + [Benchmark] public object BadgeSerialize() => Serializer.Serialize(BadgeInput); + [Benchmark] public object CommentSerialize() => Serializer.Serialize(CommentInput); + [Benchmark] public object ErrorSerialize() => Serializer.Serialize(ErrorInput); + [Benchmark] public object EventSerialize() => Serializer.Serialize(EventInput); + [Benchmark] public object MobileFeedSerialize() => Serializer.Serialize(MobileFeedInput); + [Benchmark] public object MobileQuestionSerialize() => Serializer.Serialize(MobileQuestionInput); + [Benchmark] public object MobileRepChangeSerialize() => Serializer.Serialize(MobileRepChangeInput); + [Benchmark] public object MobileInboxItemSerialize() => Serializer.Serialize(MobileInboxItemInput); + [Benchmark] public object MobileBadgeAwardSerialize() => Serializer.Serialize(MobileBadgeAwardInput); + [Benchmark] public object MobilePrivilegeSerialize() => Serializer.Serialize(MobilePrivilegeInput); + [Benchmark] public object MobileCommunityBulletinSerialize() => Serializer.Serialize(MobileCommunityBulletinInput); + [Benchmark] public object MobileAssociationBonusSerialize() => Serializer.Serialize(MobileAssociationBonusInput); + [Benchmark] public object MobileCareersJobAdSerialize() => Serializer.Serialize(MobileCareersJobAdInput); + [Benchmark] public object MobileBannerAdSerialize() => Serializer.Serialize(MobileBannerAdInput); + [Benchmark] public object MobileUpdateNoticeSerialize() => Serializer.Serialize(MobileUpdateNoticeInput); + [Benchmark] public object FlagOptionSerialize() => Serializer.Serialize(FlagOptionInput); + [Benchmark] public object InboxItemSerialize() => Serializer.Serialize(InboxItemInput); + [Benchmark] public object InfoSerialize() => Serializer.Serialize(InfoInput); + [Benchmark] public object NetworkUserSerialize() => Serializer.Serialize(NetworkUserInput); + [Benchmark] public object NotificationSerialize() => Serializer.Serialize(NotificationInput); + [Benchmark] public object PostSerialize() => Serializer.Serialize(PostInput); + [Benchmark] public object PrivilegeSerialize() => Serializer.Serialize(PrivilegeInput); + [Benchmark] public object QuestionSerialize() => Serializer.Serialize(QuestionInput); + [Benchmark] public object QuestionTimelineSerialize() => Serializer.Serialize(QuestionTimelineInput); + [Benchmark] public object ReputationSerialize() => Serializer.Serialize(ReputationInput); + [Benchmark] public object ReputationHistorySerialize() => Serializer.Serialize(ReputationHistoryInput); + [Benchmark] public object RevisionSerialize() => Serializer.Serialize(RevisionInput); + [Benchmark] public object SearchExcerptSerialize() => Serializer.Serialize(SearchExcerptInput); + [Benchmark] public object ShallowUserSerialize() => Serializer.Serialize(ShallowUserInput); + [Benchmark] public object SuggestedEditSerialize() => Serializer.Serialize(SuggestedEditInput); + [Benchmark] public object TagSerialize() => Serializer.Serialize(TagInput); + [Benchmark] public object TagScoreSerialize() => Serializer.Serialize(TagScoreInput); + [Benchmark] public object TagSynonymSerialize() => Serializer.Serialize(TagSynonymInput); + [Benchmark] public object TagWikiSerialize() => Serializer.Serialize(TagWikiInput); + [Benchmark] public object TopTagSerialize() => Serializer.Serialize(TopTagInput); + [Benchmark] public object UserSerialize() => Serializer.Serialize(UserInput); + [Benchmark] public object UserTimelineSerialize() => Serializer.Serialize(UserTimelineInput); + [Benchmark] public object WritePermissionSerialize() => Serializer.Serialize(WritePermissionInput); + [Benchmark] public object MobileBannerAdImageSerialize() => Serializer.Serialize(MobileBannerAdImageInput); + [Benchmark] public object SiteSerialize() => Serializer.Serialize(SiteInput); + [Benchmark] public object RelatedSiteSerialize() => Serializer.Serialize(RelatedSiteInput); + [Benchmark] public object ClosedDetailsSerialize() => Serializer.Serialize(ClosedDetailsInput); + [Benchmark] public object NoticeSerialize() => Serializer.Serialize(NoticeInput); + [Benchmark] public object MigrationInfoSerialize() => Serializer.Serialize(MigrationInfoInput); + [Benchmark] public object BadgeCountSerialize() => Serializer.Serialize(BadgeCountInput); + [Benchmark] public object StylingSerialize() => Serializer.Serialize(StylingInput); + [Benchmark] public object OriginalQuestionSerialize() => Serializer.Serialize(OriginalQuestionInput); + + // Deserialize + + [Benchmark] public SByte _PrimitiveSByteDeserialize() => Serializer.Deserialize(SByteOutput); + [Benchmark] public short _PrimitiveShortDeserialize() => Serializer.Deserialize(ShortOutput); + [Benchmark] public Int32 _PrimitiveIntDeserialize() => Serializer.Deserialize(IntOutput); + [Benchmark] public Int64 _PrimitiveLongDeserialize() => Serializer.Deserialize(LongOutput); + [Benchmark] public Byte _PrimitiveByteDeserialize() => Serializer.Deserialize(ByteOutput); + [Benchmark] public ushort _PrimitiveUShortDeserialize() => Serializer.Deserialize(UShortOutput); + [Benchmark] public uint _PrimitiveUIntDeserialize() => Serializer.Deserialize(UIntOutput); + [Benchmark] public ulong _PrimitiveULongDeserialize() => Serializer.Deserialize(ULongOutput); + [Benchmark] public bool _PrimitiveBoolDeserialize() => Serializer.Deserialize(BoolOutput); + [Benchmark] public String _PrimitiveStringDeserialize() => Serializer.Deserialize(StringOutput); + [Benchmark] public Char _PrimitiveCharDeserialize() => Serializer.Deserialize(CharOutput); + [Benchmark] public DateTime _PrimitiveDateTimeDeserialize() => Serializer.Deserialize(DateTimeOutput); + [Benchmark] public Guid _PrimitiveGuidDeserialize() => Serializer.Deserialize(GuidOutput); + [Benchmark] public byte[] _PrimitiveBytesDeserialize() => Serializer.Deserialize(BytesOutput); + [Benchmark] public AccessToken AccessTokenDeserialize() => Serializer.Deserialize(AccessTokenOutput); + [Benchmark] public AccountMerge AccountMergeDeserialize() => Serializer.Deserialize(AccountMergeOutput); + [Benchmark] public Answer AnswerDeserialize() => Serializer.Deserialize(AnswerOutput); + [Benchmark] public Badge BadgeDeserialize() => Serializer.Deserialize(BadgeOutput); + [Benchmark] public Comment CommentDeserialize() => Serializer.Deserialize(CommentOutput); + [Benchmark] public Error ErrorDeserialize() => Serializer.Deserialize(ErrorOutput); + [Benchmark] public Event EventDeserialize() => Serializer.Deserialize(EventOutput); + [Benchmark] public MobileFeed MobileFeedDeserialize() => Serializer.Deserialize(MobileFeedOutput); + [Benchmark] public MobileQuestion MobileQuestionDeserialize() => Serializer.Deserialize(MobileQuestionOutput); + [Benchmark] public MobileRepChange MobileRepChangeDeserialize() => Serializer.Deserialize(MobileRepChangeOutput); + [Benchmark] public MobileInboxItem MobileInboxItemDeserialize() => Serializer.Deserialize(MobileInboxItemOutput); + [Benchmark] public MobileBadgeAward MobileBadgeAwardDeserialize() => Serializer.Deserialize(MobileBadgeAwardOutput); + [Benchmark] public MobilePrivilege MobilePrivilegeDeserialize() => Serializer.Deserialize(MobilePrivilegeOutput); + [Benchmark] public MobileCommunityBulletin MobileCommunityBulletinDeserialize() => Serializer.Deserialize(MobileCommunityBulletinOutput); + [Benchmark] public MobileAssociationBonus MobileAssociationBonusDeserialize() => Serializer.Deserialize(MobileAssociationBonusOutput); + [Benchmark] public MobileCareersJobAd MobileCareersJobAdDeserialize() => Serializer.Deserialize(MobileCareersJobAdOutput); + [Benchmark] public MobileBannerAd MobileBannerAdDeserialize() => Serializer.Deserialize(MobileBannerAdOutput); + [Benchmark] public MobileUpdateNotice MobileUpdateNoticeDeserialize() => Serializer.Deserialize(MobileUpdateNoticeOutput); + [Benchmark] public FlagOption FlagOptionDeserialize() => Serializer.Deserialize(FlagOptionOutput); + [Benchmark] public InboxItem InboxItemDeserialize() => Serializer.Deserialize(InboxItemOutput); + [Benchmark] public Info InfoDeserialize() => Serializer.Deserialize(InfoOutput); + [Benchmark] public NetworkUser NetworkUserDeserialize() => Serializer.Deserialize(NetworkUserOutput); + [Benchmark] public Notification NotificationDeserialize() => Serializer.Deserialize(NotificationOutput); + [Benchmark] public Post PostDeserialize() => Serializer.Deserialize(PostOutput); + [Benchmark] public Privilege PrivilegeDeserialize() => Serializer.Deserialize(PrivilegeOutput); + [Benchmark] public Question QuestionDeserialize() => Serializer.Deserialize(QuestionOutput); + [Benchmark] public QuestionTimeline QuestionTimelineDeserialize() => Serializer.Deserialize(QuestionTimelineOutput); + [Benchmark] public Reputation ReputationDeserialize() => Serializer.Deserialize(ReputationOutput); + [Benchmark] public ReputationHistory ReputationHistoryDeserialize() => Serializer.Deserialize(ReputationHistoryOutput); + [Benchmark] public Revision RevisionDeserialize() => Serializer.Deserialize(RevisionOutput); + [Benchmark] public SearchExcerpt SearchExcerptDeserialize() => Serializer.Deserialize(SearchExcerptOutput); + [Benchmark] public ShallowUser ShallowUserDeserialize() => Serializer.Deserialize(ShallowUserOutput); + [Benchmark] public SuggestedEdit SuggestedEditDeserialize() => Serializer.Deserialize(SuggestedEditOutput); + [Benchmark] public Tag TagDeserialize() => Serializer.Deserialize(TagOutput); + [Benchmark] public TagScore TagScoreDeserialize() => Serializer.Deserialize(TagScoreOutput); + [Benchmark] public TagSynonym TagSynonymDeserialize() => Serializer.Deserialize(TagSynonymOutput); + [Benchmark] public TagWiki TagWikiDeserialize() => Serializer.Deserialize(TagWikiOutput); + [Benchmark] public TopTag TopTagDeserialize() => Serializer.Deserialize(TopTagOutput); + [Benchmark] public User UserDeserialize() => Serializer.Deserialize(UserOutput); + [Benchmark] public UserTimeline UserTimelineDeserialize() => Serializer.Deserialize(UserTimelineOutput); + [Benchmark] public WritePermission WritePermissionDeserialize() => Serializer.Deserialize(WritePermissionOutput); + [Benchmark] public MobileBannerAd.MobileBannerAdImage MobileBannerAdImageDeserialize() => Serializer.Deserialize(MobileBannerAdImageOutput); + [Benchmark] public Info.Site SiteDeserialize() => Serializer.Deserialize(SiteOutput); + [Benchmark] public Info.RelatedSite RelatedSiteDeserialize() => Serializer.Deserialize(RelatedSiteOutput); + [Benchmark] public Question.ClosedDetails ClosedDetailsDeserialize() => Serializer.Deserialize(ClosedDetailsOutput); + [Benchmark] public Question.Notice NoticeDeserialize() => Serializer.Deserialize(NoticeOutput); + [Benchmark] public Question.MigrationInfo MigrationInfoDeserialize() => Serializer.Deserialize(MigrationInfoOutput); + [Benchmark] public User.BadgeCount BadgeCountDeserialize() => Serializer.Deserialize(BadgeCountOutput); + [Benchmark] public Info.Site.Styling StylingDeserialize() => Serializer.Deserialize(StylingOutput); + [Benchmark] public Question.ClosedDetails.OriginalQuestion OriginalQuestionDeserialize() => Serializer.Deserialize(OriginalQuestionOutput); + } + + + [Config(typeof(BenchmarkConfig))] + public class MsgPackV1_Vs_MsgPackV2_BytesInOut // : AllSerializerBenchmark + { + [ParamsSource(nameof(Serializers))] + public SerializerBase Serializer; + + // Currently BenchmarkdDotNet does not detect inherited ParamsSource so use copy and paste:) + + public IEnumerable Serializers => new SerializerBase[] + { + new MsgPack_v1(), + new MsgPack_v2(), + }; + + protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); + + // primitives + + protected static readonly sbyte SByteInput = ExpressionTreeFixture.Create(); + protected static readonly short ShortInput = ExpressionTreeFixture.Create(); + protected static readonly int IntInput = ExpressionTreeFixture.Create(); + protected static readonly long LongInput = ExpressionTreeFixture.Create(); + protected static readonly byte ByteInput = ExpressionTreeFixture.Create(); + protected static readonly ushort UShortInput = ExpressionTreeFixture.Create(); + protected static readonly uint UIntInput = ExpressionTreeFixture.Create(); + protected static readonly ulong ULongInput = ExpressionTreeFixture.Create(); + protected static readonly bool BoolInput = ExpressionTreeFixture.Create(); + protected static readonly string StringInput = ExpressionTreeFixture.Create(); + protected static readonly char CharInput = ExpressionTreeFixture.Create(); + protected static readonly DateTime DateTimeInput = ExpressionTreeFixture.Create(); + protected static readonly Guid GuidInput = ExpressionTreeFixture.Create(); + protected static readonly byte[] BytesInput = ExpressionTreeFixture.Create(); + + // models + + protected static readonly Benchmark.Models.AccessToken AccessTokenInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.AccountMerge AccountMergeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Answer AnswerInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Badge BadgeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Comment CommentInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Error ErrorInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Event EventInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileFeed MobileFeedInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileQuestion MobileQuestionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileRepChange MobileRepChangeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileInboxItem MobileInboxItemInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileBadgeAward MobileBadgeAwardInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobilePrivilege MobilePrivilegeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileCommunityBulletin MobileCommunityBulletinInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileAssociationBonus MobileAssociationBonusInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileCareersJobAd MobileCareersJobAdInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileBannerAd MobileBannerAdInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileUpdateNotice MobileUpdateNoticeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.FlagOption FlagOptionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.InboxItem InboxItemInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info InfoInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.NetworkUser NetworkUserInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Notification NotificationInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Post PostInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Privilege PrivilegeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question QuestionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.QuestionTimeline QuestionTimelineInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Reputation ReputationInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.ReputationHistory ReputationHistoryInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Revision RevisionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.SearchExcerpt SearchExcerptInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.ShallowUser ShallowUserInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.SuggestedEdit SuggestedEditInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Tag TagInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TagScore TagScoreInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TagSynonym TagSynonymInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TagWiki TagWikiInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.TopTag TopTagInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.User UserInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.UserTimeline UserTimelineInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.WritePermission WritePermissionInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.MobileBannerAd.MobileBannerAdImage MobileBannerAdImageInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info.Site SiteInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info.RelatedSite RelatedSiteInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.ClosedDetails ClosedDetailsInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.Notice NoticeInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.MigrationInfo MigrationInfoInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.User.BadgeCount BadgeCountInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Info.Site.Styling StylingInput = ExpressionTreeFixture.Create(); + + protected static readonly Benchmark.Models.Question.ClosedDetails.OriginalQuestion OriginalQuestionInput = ExpressionTreeFixture.Create(); + + object SByteOutput; + object ShortOutput; + object IntOutput; + object LongOutput; + object ByteOutput; + object UShortOutput; + object UIntOutput; + object ULongOutput; + object BoolOutput; + object StringOutput; + object CharOutput; + object DateTimeOutput; + object GuidOutput; + object BytesOutput; + + object AccessTokenOutput; + object AccountMergeOutput; + object AnswerOutput; + object BadgeOutput; + object CommentOutput; + object ErrorOutput; + object EventOutput; + object MobileFeedOutput; + object MobileQuestionOutput; + object MobileRepChangeOutput; + object MobileInboxItemOutput; + object MobileBadgeAwardOutput; + object MobilePrivilegeOutput; + object MobileCommunityBulletinOutput; + object MobileAssociationBonusOutput; + object MobileCareersJobAdOutput; + object MobileBannerAdOutput; + object MobileUpdateNoticeOutput; + object FlagOptionOutput; + object InboxItemOutput; + object InfoOutput; + object NetworkUserOutput; + object NotificationOutput; + object PostOutput; + object PrivilegeOutput; + object QuestionOutput; + object QuestionTimelineOutput; + object ReputationOutput; + object ReputationHistoryOutput; + object RevisionOutput; + object SearchExcerptOutput; + object ShallowUserOutput; + object SuggestedEditOutput; + object TagOutput; + object TagScoreOutput; + object TagSynonymOutput; + object TagWikiOutput; + object TopTagOutput; + object UserOutput; + object UserTimelineOutput; + object WritePermissionOutput; + object MobileBannerAdImageOutput; + object SiteOutput; + object RelatedSiteOutput; + object ClosedDetailsOutput; + object NoticeOutput; + object MigrationInfoOutput; + object BadgeCountOutput; + object StylingOutput; + object OriginalQuestionOutput; + + [GlobalSetup] + public void Setup() + { + // primitives + SByteOutput = Serializer.Serialize(SByteInput); + ShortOutput = Serializer.Serialize(ShortInput); + IntOutput = Serializer.Serialize(IntInput); + LongOutput = Serializer.Serialize(LongInput); + ByteOutput = Serializer.Serialize(ByteInput); + UShortOutput = Serializer.Serialize(UShortInput); + UIntOutput = Serializer.Serialize(UIntInput); + ULongOutput = Serializer.Serialize(ULongInput); + BoolOutput = Serializer.Serialize(BoolInput); + StringOutput = Serializer.Serialize(StringInput); + CharOutput = Serializer.Serialize(CharInput); + DateTimeOutput = Serializer.Serialize(DateTimeInput); + GuidOutput = Serializer.Serialize(GuidInput); + BytesOutput = Serializer.Serialize(BytesInput); + + // models + AccessTokenOutput = Serializer.Serialize(AccessTokenInput); + AccountMergeOutput = Serializer.Serialize(AccountMergeInput); + AnswerOutput = Serializer.Serialize(AnswerInput); + BadgeOutput = Serializer.Serialize(BadgeInput); + CommentOutput = Serializer.Serialize(CommentInput); + ErrorOutput = Serializer.Serialize(ErrorInput); + EventOutput = Serializer.Serialize(EventInput); + MobileFeedOutput = Serializer.Serialize(MobileFeedInput); + MobileQuestionOutput = Serializer.Serialize(MobileQuestionInput); + MobileRepChangeOutput = Serializer.Serialize(MobileRepChangeInput); + MobileInboxItemOutput = Serializer.Serialize(MobileInboxItemInput); + MobileBadgeAwardOutput = Serializer.Serialize(MobileBadgeAwardInput); + MobilePrivilegeOutput = Serializer.Serialize(MobilePrivilegeInput); + MobileCommunityBulletinOutput = Serializer.Serialize(MobileCommunityBulletinInput); + MobileAssociationBonusOutput = Serializer.Serialize(MobileAssociationBonusInput); + MobileCareersJobAdOutput = Serializer.Serialize(MobileCareersJobAdInput); + MobileBannerAdOutput = Serializer.Serialize(MobileBannerAdInput); + MobileUpdateNoticeOutput = Serializer.Serialize(MobileUpdateNoticeInput); + FlagOptionOutput = Serializer.Serialize(FlagOptionInput); + InboxItemOutput = Serializer.Serialize(InboxItemInput); + InfoOutput = Serializer.Serialize(InfoInput); + NetworkUserOutput = Serializer.Serialize(NetworkUserInput); + NotificationOutput = Serializer.Serialize(NotificationInput); + PostOutput = Serializer.Serialize(PostInput); + PrivilegeOutput = Serializer.Serialize(PrivilegeInput); + QuestionOutput = Serializer.Serialize(QuestionInput); + QuestionTimelineOutput = Serializer.Serialize(QuestionTimelineInput); + ReputationOutput = Serializer.Serialize(ReputationInput); + ReputationHistoryOutput = Serializer.Serialize(ReputationHistoryInput); + RevisionOutput = Serializer.Serialize(RevisionInput); + SearchExcerptOutput = Serializer.Serialize(SearchExcerptInput); + ShallowUserOutput = Serializer.Serialize(ShallowUserInput); + SuggestedEditOutput = Serializer.Serialize(SuggestedEditInput); + TagOutput = Serializer.Serialize(TagInput); + TagScoreOutput = Serializer.Serialize(TagScoreInput); + TagSynonymOutput = Serializer.Serialize(TagSynonymInput); + TagWikiOutput = Serializer.Serialize(TagWikiInput); + TopTagOutput = Serializer.Serialize(TopTagInput); + UserOutput = Serializer.Serialize(UserInput); + UserTimelineOutput = Serializer.Serialize(UserTimelineInput); + WritePermissionOutput = Serializer.Serialize(WritePermissionInput); + MobileBannerAdImageOutput = Serializer.Serialize(MobileBannerAdImageInput); + SiteOutput = Serializer.Serialize(SiteInput); + RelatedSiteOutput = Serializer.Serialize(RelatedSiteInput); + ClosedDetailsOutput = Serializer.Serialize(ClosedDetailsInput); + NoticeOutput = Serializer.Serialize(NoticeInput); + MigrationInfoOutput = Serializer.Serialize(MigrationInfoInput); + BadgeCountOutput = Serializer.Serialize(BadgeCountInput); + StylingOutput = Serializer.Serialize(StylingInput); + OriginalQuestionOutput = Serializer.Serialize(OriginalQuestionInput); + } + + // Serialize + + [Benchmark] public object _PrimitiveSByteSerialize() => Serializer.Serialize(SByteInput); + [Benchmark] public object _PrimitiveShortSerialize() => Serializer.Serialize(ShortInput); + [Benchmark] public object _PrimitiveIntSerialize() => Serializer.Serialize(IntInput); + [Benchmark] public object _PrimitiveLongSerialize() => Serializer.Serialize(LongInput); + [Benchmark] public object _PrimitiveByteSerialize() => Serializer.Serialize(ByteInput); + [Benchmark] public object _PrimitiveUShortSerialize() => Serializer.Serialize(UShortInput); + [Benchmark] public object _PrimitiveUIntSerialize() => Serializer.Serialize(UIntInput); + [Benchmark] public object _PrimitiveULongSerialize() => Serializer.Serialize(ULongInput); + [Benchmark] public object _PrimitiveBoolSerialize() => Serializer.Serialize(BoolInput); + [Benchmark] public object _PrimitiveStringSerialize() => Serializer.Serialize(StringInput); + [Benchmark] public object _PrimitiveCharSerialize() => Serializer.Serialize(CharInput); + [Benchmark] public object _PrimitiveDateTimeSerialize() => Serializer.Serialize(DateTimeInput); + [Benchmark] public object _PrimitiveGuidSerialize() => Serializer.Serialize(GuidInput); + [Benchmark] public object _PrimitiveBytesSerialize() => Serializer.Serialize(BytesInput); + + [Benchmark] public object AccessTokenSerialize() => Serializer.Serialize(AccessTokenInput); + [Benchmark] public object AccountMergeSerialize() => Serializer.Serialize(AccountMergeInput); + [Benchmark] public object AnswerSerialize() => Serializer.Serialize(AnswerInput); + [Benchmark] public object BadgeSerialize() => Serializer.Serialize(BadgeInput); + [Benchmark] public object CommentSerialize() => Serializer.Serialize(CommentInput); + [Benchmark] public object ErrorSerialize() => Serializer.Serialize(ErrorInput); + [Benchmark] public object EventSerialize() => Serializer.Serialize(EventInput); + [Benchmark] public object MobileFeedSerialize() => Serializer.Serialize(MobileFeedInput); + [Benchmark] public object MobileQuestionSerialize() => Serializer.Serialize(MobileQuestionInput); + [Benchmark] public object MobileRepChangeSerialize() => Serializer.Serialize(MobileRepChangeInput); + [Benchmark] public object MobileInboxItemSerialize() => Serializer.Serialize(MobileInboxItemInput); + [Benchmark] public object MobileBadgeAwardSerialize() => Serializer.Serialize(MobileBadgeAwardInput); + [Benchmark] public object MobilePrivilegeSerialize() => Serializer.Serialize(MobilePrivilegeInput); + [Benchmark] public object MobileCommunityBulletinSerialize() => Serializer.Serialize(MobileCommunityBulletinInput); + [Benchmark] public object MobileAssociationBonusSerialize() => Serializer.Serialize(MobileAssociationBonusInput); + [Benchmark] public object MobileCareersJobAdSerialize() => Serializer.Serialize(MobileCareersJobAdInput); + [Benchmark] public object MobileBannerAdSerialize() => Serializer.Serialize(MobileBannerAdInput); + [Benchmark] public object MobileUpdateNoticeSerialize() => Serializer.Serialize(MobileUpdateNoticeInput); + [Benchmark] public object FlagOptionSerialize() => Serializer.Serialize(FlagOptionInput); + [Benchmark] public object InboxItemSerialize() => Serializer.Serialize(InboxItemInput); + [Benchmark] public object InfoSerialize() => Serializer.Serialize(InfoInput); + [Benchmark] public object NetworkUserSerialize() => Serializer.Serialize(NetworkUserInput); + [Benchmark] public object NotificationSerialize() => Serializer.Serialize(NotificationInput); + [Benchmark] public object PostSerialize() => Serializer.Serialize(PostInput); + [Benchmark] public object PrivilegeSerialize() => Serializer.Serialize(PrivilegeInput); + [Benchmark] public object QuestionSerialize() => Serializer.Serialize(QuestionInput); + [Benchmark] public object QuestionTimelineSerialize() => Serializer.Serialize(QuestionTimelineInput); + [Benchmark] public object ReputationSerialize() => Serializer.Serialize(ReputationInput); + [Benchmark] public object ReputationHistorySerialize() => Serializer.Serialize(ReputationHistoryInput); + [Benchmark] public object RevisionSerialize() => Serializer.Serialize(RevisionInput); + [Benchmark] public object SearchExcerptSerialize() => Serializer.Serialize(SearchExcerptInput); + [Benchmark] public object ShallowUserSerialize() => Serializer.Serialize(ShallowUserInput); + [Benchmark] public object SuggestedEditSerialize() => Serializer.Serialize(SuggestedEditInput); + [Benchmark] public object TagSerialize() => Serializer.Serialize(TagInput); + [Benchmark] public object TagScoreSerialize() => Serializer.Serialize(TagScoreInput); + [Benchmark] public object TagSynonymSerialize() => Serializer.Serialize(TagSynonymInput); + [Benchmark] public object TagWikiSerialize() => Serializer.Serialize(TagWikiInput); + [Benchmark] public object TopTagSerialize() => Serializer.Serialize(TopTagInput); + [Benchmark] public object UserSerialize() => Serializer.Serialize(UserInput); + [Benchmark] public object UserTimelineSerialize() => Serializer.Serialize(UserTimelineInput); + [Benchmark] public object WritePermissionSerialize() => Serializer.Serialize(WritePermissionInput); + [Benchmark] public object MobileBannerAdImageSerialize() => Serializer.Serialize(MobileBannerAdImageInput); + [Benchmark] public object SiteSerialize() => Serializer.Serialize(SiteInput); + [Benchmark] public object RelatedSiteSerialize() => Serializer.Serialize(RelatedSiteInput); + [Benchmark] public object ClosedDetailsSerialize() => Serializer.Serialize(ClosedDetailsInput); + [Benchmark] public object NoticeSerialize() => Serializer.Serialize(NoticeInput); + [Benchmark] public object MigrationInfoSerialize() => Serializer.Serialize(MigrationInfoInput); + [Benchmark] public object BadgeCountSerialize() => Serializer.Serialize(BadgeCountInput); + [Benchmark] public object StylingSerialize() => Serializer.Serialize(StylingInput); + [Benchmark] public object OriginalQuestionSerialize() => Serializer.Serialize(OriginalQuestionInput); + + // Deserialize + + [Benchmark] public SByte _PrimitiveSByteDeserialize() => Serializer.Deserialize(SByteOutput); + [Benchmark] public short _PrimitiveShortDeserialize() => Serializer.Deserialize(ShortOutput); + [Benchmark] public Int32 _PrimitiveIntDeserialize() => Serializer.Deserialize(IntOutput); + [Benchmark] public Int64 _PrimitiveLongDeserialize() => Serializer.Deserialize(LongOutput); + [Benchmark] public Byte _PrimitiveByteDeserialize() => Serializer.Deserialize(ByteOutput); + [Benchmark] public ushort _PrimitiveUShortDeserialize() => Serializer.Deserialize(UShortOutput); + [Benchmark] public uint _PrimitiveUIntDeserialize() => Serializer.Deserialize(UIntOutput); + [Benchmark] public ulong _PrimitiveULongDeserialize() => Serializer.Deserialize(ULongOutput); + [Benchmark] public bool _PrimitiveBoolDeserialize() => Serializer.Deserialize(BoolOutput); + [Benchmark] public String _PrimitiveStringDeserialize() => Serializer.Deserialize(StringOutput); + [Benchmark] public Char _PrimitiveCharDeserialize() => Serializer.Deserialize(CharOutput); + [Benchmark] public DateTime _PrimitiveDateTimeDeserialize() => Serializer.Deserialize(DateTimeOutput); + [Benchmark] public Guid _PrimitiveGuidDeserialize() => Serializer.Deserialize(GuidOutput); + [Benchmark] public byte[] _PrimitiveBytesDeserialize() => Serializer.Deserialize(BytesOutput); + [Benchmark] public AccessToken AccessTokenDeserialize() => Serializer.Deserialize(AccessTokenOutput); + [Benchmark] public AccountMerge AccountMergeDeserialize() => Serializer.Deserialize(AccountMergeOutput); + [Benchmark] public Answer AnswerDeserialize() => Serializer.Deserialize(AnswerOutput); + [Benchmark] public Badge BadgeDeserialize() => Serializer.Deserialize(BadgeOutput); + [Benchmark] public Comment CommentDeserialize() => Serializer.Deserialize(CommentOutput); + [Benchmark] public Error ErrorDeserialize() => Serializer.Deserialize(ErrorOutput); + [Benchmark] public Event EventDeserialize() => Serializer.Deserialize(EventOutput); + [Benchmark] public MobileFeed MobileFeedDeserialize() => Serializer.Deserialize(MobileFeedOutput); + [Benchmark] public MobileQuestion MobileQuestionDeserialize() => Serializer.Deserialize(MobileQuestionOutput); + [Benchmark] public MobileRepChange MobileRepChangeDeserialize() => Serializer.Deserialize(MobileRepChangeOutput); + [Benchmark] public MobileInboxItem MobileInboxItemDeserialize() => Serializer.Deserialize(MobileInboxItemOutput); + [Benchmark] public MobileBadgeAward MobileBadgeAwardDeserialize() => Serializer.Deserialize(MobileBadgeAwardOutput); + [Benchmark] public MobilePrivilege MobilePrivilegeDeserialize() => Serializer.Deserialize(MobilePrivilegeOutput); + [Benchmark] public MobileCommunityBulletin MobileCommunityBulletinDeserialize() => Serializer.Deserialize(MobileCommunityBulletinOutput); + [Benchmark] public MobileAssociationBonus MobileAssociationBonusDeserialize() => Serializer.Deserialize(MobileAssociationBonusOutput); + [Benchmark] public MobileCareersJobAd MobileCareersJobAdDeserialize() => Serializer.Deserialize(MobileCareersJobAdOutput); + [Benchmark] public MobileBannerAd MobileBannerAdDeserialize() => Serializer.Deserialize(MobileBannerAdOutput); + [Benchmark] public MobileUpdateNotice MobileUpdateNoticeDeserialize() => Serializer.Deserialize(MobileUpdateNoticeOutput); + [Benchmark] public FlagOption FlagOptionDeserialize() => Serializer.Deserialize(FlagOptionOutput); + [Benchmark] public InboxItem InboxItemDeserialize() => Serializer.Deserialize(InboxItemOutput); + [Benchmark] public Info InfoDeserialize() => Serializer.Deserialize(InfoOutput); + [Benchmark] public NetworkUser NetworkUserDeserialize() => Serializer.Deserialize(NetworkUserOutput); + [Benchmark] public Notification NotificationDeserialize() => Serializer.Deserialize(NotificationOutput); + [Benchmark] public Post PostDeserialize() => Serializer.Deserialize(PostOutput); + [Benchmark] public Privilege PrivilegeDeserialize() => Serializer.Deserialize(PrivilegeOutput); + [Benchmark] public Question QuestionDeserialize() => Serializer.Deserialize(QuestionOutput); + [Benchmark] public QuestionTimeline QuestionTimelineDeserialize() => Serializer.Deserialize(QuestionTimelineOutput); + [Benchmark] public Reputation ReputationDeserialize() => Serializer.Deserialize(ReputationOutput); + [Benchmark] public ReputationHistory ReputationHistoryDeserialize() => Serializer.Deserialize(ReputationHistoryOutput); + [Benchmark] public Revision RevisionDeserialize() => Serializer.Deserialize(RevisionOutput); + [Benchmark] public SearchExcerpt SearchExcerptDeserialize() => Serializer.Deserialize(SearchExcerptOutput); + [Benchmark] public ShallowUser ShallowUserDeserialize() => Serializer.Deserialize(ShallowUserOutput); + [Benchmark] public SuggestedEdit SuggestedEditDeserialize() => Serializer.Deserialize(SuggestedEditOutput); + [Benchmark] public Tag TagDeserialize() => Serializer.Deserialize(TagOutput); + [Benchmark] public TagScore TagScoreDeserialize() => Serializer.Deserialize(TagScoreOutput); + [Benchmark] public TagSynonym TagSynonymDeserialize() => Serializer.Deserialize(TagSynonymOutput); + [Benchmark] public TagWiki TagWikiDeserialize() => Serializer.Deserialize(TagWikiOutput); + [Benchmark] public TopTag TopTagDeserialize() => Serializer.Deserialize(TopTagOutput); + [Benchmark] public User UserDeserialize() => Serializer.Deserialize(UserOutput); + [Benchmark] public UserTimeline UserTimelineDeserialize() => Serializer.Deserialize(UserTimelineOutput); + [Benchmark] public WritePermission WritePermissionDeserialize() => Serializer.Deserialize(WritePermissionOutput); + [Benchmark] public MobileBannerAd.MobileBannerAdImage MobileBannerAdImageDeserialize() => Serializer.Deserialize(MobileBannerAdImageOutput); + [Benchmark] public Info.Site SiteDeserialize() => Serializer.Deserialize(SiteOutput); + [Benchmark] public Info.RelatedSite RelatedSiteDeserialize() => Serializer.Deserialize(RelatedSiteOutput); + [Benchmark] public Question.ClosedDetails ClosedDetailsDeserialize() => Serializer.Deserialize(ClosedDetailsOutput); + [Benchmark] public Question.Notice NoticeDeserialize() => Serializer.Deserialize(NoticeOutput); + [Benchmark] public Question.MigrationInfo MigrationInfoDeserialize() => Serializer.Deserialize(MigrationInfoOutput); + [Benchmark] public User.BadgeCount BadgeCountDeserialize() => Serializer.Deserialize(BadgeCountOutput); + [Benchmark] public Info.Site.Styling StylingDeserialize() => Serializer.Deserialize(StylingOutput); + [Benchmark] public Question.ClosedDetails.OriginalQuestion OriginalQuestionDeserialize() => Serializer.Deserialize(OriginalQuestionOutput); + } + + + [Config(typeof(BenchmarkConfig))] + public class ShortRun_AllSerializerBenchmark_BytesInOut + { + [ParamsSource(nameof(Serializers))] + public SerializerBase Serializer; + + // Currently BenchmarkdDotNet does not detect inherited ParamsSource so use copy and paste:) + + public IEnumerable Serializers => new SerializerBase[] + { + new MsgPack_v1(), + new MsgPack_v2(), + new MsgPackLz4_v1(), + new MsgPackLz4_v2(), + new Protobuf(), + new JsonNet(), + new BinaryFormatter_(), + new DataContract_(), + new Hyperion_(), + new Jil_(), + new SpanJson_(), + new Utf8Json_(), + new MsgPackCli(), + new FsPickler_() + }; + + protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); + + // primitives + + protected static readonly int IntInput = ExpressionTreeFixture.Create(); + + // models + + protected static readonly Benchmark.Models.Answer AnswerInput = ExpressionTreeFixture.Create(); + + object IntOutput; + object AnswerOutput; + + + [GlobalSetup] + public void Setup() + { + // primitives + IntOutput = Serializer.Serialize(IntInput); + + // models + AnswerOutput = Serializer.Serialize(AnswerInput); + } + + // Serialize + + [Benchmark] public object _PrimitiveIntSerialize() => Serializer.Serialize(IntInput); + [Benchmark] public object AnswerSerialize() => Serializer.Serialize(AnswerInput); + + // Deserialize + + [Benchmark] public Int32 _PrimitiveIntDeserialize() => Serializer.Deserialize(IntOutput); + + [Benchmark] public Answer AnswerDeserialize() => Serializer.Deserialize(AnswerOutput); + } + + [Config(typeof(BenchmarkConfig))] + public class ShortRun_MsgPackV1_Vs_MsgPackV2_BytesInOut + { + [ParamsSource(nameof(Serializers))] + public SerializerBase Serializer; + + // Currently BenchmarkdDotNet does not detect inherited ParamsSource so use copy and paste:) + + public IEnumerable Serializers => new SerializerBase[] + { + new MsgPack_v1(), + new MsgPack_v2(), + }; + + protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); + + // primitives + + protected static readonly int IntInput = ExpressionTreeFixture.Create(); + + // models + + protected static readonly Benchmark.Models.Answer AnswerInput = ExpressionTreeFixture.Create(); + + object IntOutput; + object AnswerOutput; + + + [GlobalSetup] + public void Setup() + { + // primitives + IntOutput = Serializer.Serialize(IntInput); + + // models + AnswerOutput = Serializer.Serialize(AnswerInput); + } + + // Serialize + + [Benchmark] public object _PrimitiveIntSerialize() => Serializer.Serialize(IntInput); + [Benchmark] public object AnswerSerialize() => Serializer.Serialize(AnswerInput); + + // Deserialize + + [Benchmark] public Int32 _PrimitiveIntDeserialize() => Serializer.Deserialize(IntOutput); + + [Benchmark] public Answer AnswerDeserialize() => Serializer.Deserialize(AnswerOutput); + } +} diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.csproj b/benchmark/SerializerBenchmark/SerializerBenchmark.csproj new file mode 100644 index 000000000..14700dafc --- /dev/null +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.csproj @@ -0,0 +1,45 @@ + + + + Exe + netcoreapp2.1 + SerializerBenchmark + Benchmark + + + + true + + + + true + + + + + + + + + + + + + + + + + newmsgpack + + + + + + MessagePack_1_7_3_6.dll + oldmsgpack + true + false + + + + diff --git a/benchmark/SerializerBenchmark/Serializers/BinaryFormatter.cs b/benchmark/SerializerBenchmark/Serializers/BinaryFormatter.cs new file mode 100644 index 000000000..85065df9b --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/BinaryFormatter.cs @@ -0,0 +1,24 @@ +using Benchmark.Serializers; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +public class BinaryFormatter_ : SerializerBase +{ + public override T Deserialize(object input) + { + using (var ms = new MemoryStream((byte[])input)) + { + return (T)new BinaryFormatter().Deserialize(ms); + } + } + + public override object Serialize(T input) + { + using (var ms = new MemoryStream()) + { + new BinaryFormatter().Serialize(ms, input); + ms.Flush(); + return ms.ToArray(); + } + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/DataContractSerializer.cs b/benchmark/SerializerBenchmark/Serializers/DataContractSerializer.cs new file mode 100644 index 000000000..8ba0a1c2d --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/DataContractSerializer.cs @@ -0,0 +1,24 @@ +using Benchmark.Serializers; +using System.IO; +using System.Runtime.Serialization; + +public class DataContract_ : SerializerBase +{ + public override T Deserialize(object input) + { + using (var ms = new MemoryStream((byte[])input)) + { + return (T)new DataContractSerializer(typeof(T)).ReadObject(ms); + } + } + + public override object Serialize(T input) + { + using (var ms = new MemoryStream()) + { + new DataContractSerializer(typeof(T)).WriteObject(ms, input); + ms.Flush(); + return ms.ToArray(); + } + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/FsPicklerSerializer.cs b/benchmark/SerializerBenchmark/Serializers/FsPicklerSerializer.cs new file mode 100644 index 000000000..778b31131 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/FsPicklerSerializer.cs @@ -0,0 +1,26 @@ +using Benchmark.Serializers; +using MBrace.FsPickler; +using System.IO; + +public class FsPickler_ : SerializerBase +{ + static readonly BinarySerializer serializer = MBrace.FsPickler.FsPickler.CreateBinarySerializer(); + + public override T Deserialize(object input) + { + using (var ms = new MemoryStream((byte[])input)) + { + return serializer.Deserialize(ms); + } + } + + public override object Serialize(T input) + { + using (var ms = new MemoryStream()) + { + serializer.Serialize(ms, input); + ms.Flush(); + return ms.ToArray(); + } + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/HyperionSerializer.cs b/benchmark/SerializerBenchmark/Serializers/HyperionSerializer.cs new file mode 100644 index 000000000..517fbe3ca --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/HyperionSerializer.cs @@ -0,0 +1,26 @@ +using Benchmark.Serializers; +using Hyperion; +using System.IO; + +public class Hyperion_ : SerializerBase +{ + static readonly Serializer serializer = new Hyperion.Serializer(); + + public override T Deserialize(object input) + { + using (var ms = new MemoryStream((byte[])input)) + { + return serializer.Deserialize(ms); + } + } + + public override object Serialize(T input) + { + using (var ms = new MemoryStream()) + { + serializer.Serialize(input, ms); + ms.Flush(); + return ms.ToArray(); + } + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/JilSerializer.cs b/benchmark/SerializerBenchmark/Serializers/JilSerializer.cs new file mode 100644 index 000000000..e0d149366 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/JilSerializer.cs @@ -0,0 +1,16 @@ +using Benchmark.Serializers; +using Jil; +using System.Text; + +public class Jil_ : SerializerBase +{ + public override object Serialize(T input) + { + return Encoding.UTF8.GetBytes(Jil.JSON.Serialize(input, Options.ISO8601)); + } + + public override T Deserialize(object input) + { + return Jil.JSON.Deserialize(Encoding.UTF8.GetString((byte[])input), Options.ISO8601); + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Serializers/JsonNetSerializer.cs b/benchmark/SerializerBenchmark/Serializers/JsonNetSerializer.cs new file mode 100644 index 000000000..bddffb308 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/JsonNetSerializer.cs @@ -0,0 +1,33 @@ +using Benchmark.Serializers; +using Newtonsoft.Json; +using System.IO; +using System.Text; + +public class JsonNet : SerializerBase +{ + static readonly JsonSerializer serializer = new JsonSerializer(); + + public override T Deserialize(object input) + { + using (var ms = new MemoryStream((byte[])input)) + using (var sr = new StreamReader(ms, Encoding.UTF8)) + using (var jr = new JsonTextReader(sr)) + { + return serializer.Deserialize(jr); + } + } + + public override object Serialize(T input) + { + using (var ms = new MemoryStream()) + { + using (var sw = new StreamWriter(ms, Encoding.UTF8)) + using (var jw = new JsonTextWriter(sw)) + { + serializer.Serialize(jw, input); + } + ms.Flush(); + return ms.ToArray(); + } + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs b/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs new file mode 100644 index 000000000..1f3c343c0 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs @@ -0,0 +1,56 @@ +extern alias oldmsgpack; +extern alias newmsgpack; + +using Benchmark.Serializers; + +public class MsgPack_v1 : SerializerBase +{ + public override T Deserialize(object input) + { + return oldmsgpack::MessagePack.MessagePackSerializer.Deserialize((byte[])input); + } + + public override object Serialize(T input) + { + return oldmsgpack::MessagePack.MessagePackSerializer.Serialize(input); + } +} + +public class MsgPack_v2 : SerializerBase +{ + public override T Deserialize(object input) + { + return newmsgpack::MessagePack.MessagePackSerializer.Deserialize((byte[])input); + } + + public override object Serialize(T input) + { + return newmsgpack::MessagePack.MessagePackSerializer.Serialize(input); + } +} + +public class MsgPackLz4_v1 : SerializerBase +{ + public override T Deserialize(object input) + { + return oldmsgpack::MessagePack.LZ4MessagePackSerializer.Deserialize((byte[])input); + } + + public override object Serialize(T input) + { + return oldmsgpack::MessagePack.LZ4MessagePackSerializer.Serialize(input); + } +} + +public class MsgPackLz4_v2 : SerializerBase +{ + public override T Deserialize(object input) + { + return newmsgpack::MessagePack.LZ4MessagePackSerializer.Deserialize((byte[])input); + } + + public override object Serialize(T input) + { + return newmsgpack::MessagePack.LZ4MessagePackSerializer.Serialize(input); + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Serializers/MsgPackCliSerializer.cs b/benchmark/SerializerBenchmark/Serializers/MsgPackCliSerializer.cs new file mode 100644 index 000000000..77f97b9d9 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/MsgPackCliSerializer.cs @@ -0,0 +1,14 @@ +using Benchmark.Serializers; + +public class MsgPackCli : SerializerBase +{ + public override T Deserialize(object input) + { + return MsgPack.Serialization.MessagePackSerializer.Get().UnpackSingleObject((byte[])input); + } + + public override object Serialize(T input) + { + return MsgPack.Serialization.MessagePackSerializer.Get().PackSingleObject(input); + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs b/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs new file mode 100644 index 000000000..eab51f636 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs @@ -0,0 +1,23 @@ +using Benchmark.Serializers; +using ProtoBuf; +using System.IO; + +public class Protobuf : SerializerBase +{ + public override T Deserialize(object input) + { + using (var ms = new MemoryStream((byte[])input)) + { + return Serializer.Deserialize(ms); + } + } + + public override object Serialize(T input) + { + using (var ms = new MemoryStream()) + { + Serializer.Serialize(ms, input); + return ms.ToArray(); + } + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/SerializerBase.cs b/benchmark/SerializerBenchmark/Serializers/SerializerBase.cs new file mode 100644 index 000000000..6bcd133c2 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/SerializerBase.cs @@ -0,0 +1,13 @@ +using System; + +namespace Benchmark.Serializers +{ + public abstract class SerializerBase + { + public abstract object Serialize(T input); + + public abstract T Deserialize(object input); + + + } +} \ No newline at end of file diff --git a/benchmark/SerializerBenchmark/Serializers/SpanJsonSerializer.cs b/benchmark/SerializerBenchmark/Serializers/SpanJsonSerializer.cs new file mode 100644 index 000000000..6407eb7e5 --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/SpanJsonSerializer.cs @@ -0,0 +1,14 @@ +using Benchmark.Serializers; + +public class SpanJson_ : SerializerBase +{ + public override object Serialize(T input) + { + return SpanJson.JsonSerializer.Generic.Utf8.Serialize(input); + } + + public override T Deserialize(object input) + { + return SpanJson.JsonSerializer.Generic.Utf8.Deserialize((byte[])input); + } +} diff --git a/benchmark/SerializerBenchmark/Serializers/Utf8JsonSerializer.cs b/benchmark/SerializerBenchmark/Serializers/Utf8JsonSerializer.cs new file mode 100644 index 000000000..70070b12b --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/Utf8JsonSerializer.cs @@ -0,0 +1,14 @@ +using Benchmark.Serializers; + +public class Utf8Json_ : SerializerBase +{ + public override object Serialize(T input) + { + return Utf8Json.JsonSerializer.Serialize(input); + } + + public override T Deserialize(object input) + { + return Utf8Json.JsonSerializer.Deserialize((byte[])input); + } +} diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index 8b32e40f5..cd48adf2d 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -11,10 +11,17 @@ Codestin Search App Extremely Fast MessagePack(MsgPack) Serializer for C#(.NET, .NET Core, Unity, Xamarin). MsgPack;MessagePack;Serialization;Formatter;Serializer;Unity;Xamarin + MessagePack + + + + + + From 6fe0a351aff6df2b8a0b77eca7eca9aa5973b048 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Sun, 10 Mar 2019 22:36:32 +0900 Subject: [PATCH 061/105] Benchmark rename, MsgPack -> MessagePack --- .../SerializerBenchmark.cs | 24 +++++++++---------- .../Serializers/MessagePackSerializer.cs | 8 +++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.cs b/benchmark/SerializerBenchmark/SerializerBenchmark.cs index 8f1a7f036..f6fa04c9d 100644 --- a/benchmark/SerializerBenchmark/SerializerBenchmark.cs +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.cs @@ -17,10 +17,10 @@ public class AllSerializerBenchmark_BytesInOut public IEnumerable Serializers => new SerializerBase[] { - new MsgPack_v1(), - new MsgPack_v2(), - new MsgPackLz4_v1(), - new MsgPackLz4_v2(), + new MessagePack_v1(), + new MessagePack_v2(), + new MessagePackLz4_v1(), + new MessagePackLz4_v2(), new Protobuf(), new JsonNet(), new BinaryFormatter_(), @@ -439,8 +439,8 @@ public class MsgPackV1_Vs_MsgPackV2_BytesInOut // : AllSerializerBenchmark public IEnumerable Serializers => new SerializerBase[] { - new MsgPack_v1(), - new MsgPack_v2(), + new MessagePack_v1(), + new MessagePack_v2(), }; protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); @@ -849,10 +849,10 @@ public class ShortRun_AllSerializerBenchmark_BytesInOut public IEnumerable Serializers => new SerializerBase[] { - new MsgPack_v1(), - new MsgPack_v2(), - new MsgPackLz4_v1(), - new MsgPackLz4_v2(), + new MessagePack_v1(), + new MessagePack_v2(), + new MessagePackLz4_v1(), + new MessagePackLz4_v2(), new Protobuf(), new JsonNet(), new BinaryFormatter_(), @@ -911,8 +911,8 @@ public class ShortRun_MsgPackV1_Vs_MsgPackV2_BytesInOut public IEnumerable Serializers => new SerializerBase[] { - new MsgPack_v1(), - new MsgPack_v2(), + new MessagePack_v1(), + new MessagePack_v2(), }; protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); diff --git a/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs b/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs index 1f3c343c0..ec66b03ba 100644 --- a/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs +++ b/benchmark/SerializerBenchmark/Serializers/MessagePackSerializer.cs @@ -3,7 +3,7 @@ using Benchmark.Serializers; -public class MsgPack_v1 : SerializerBase +public class MessagePack_v1 : SerializerBase { public override T Deserialize(object input) { @@ -16,7 +16,7 @@ public override object Serialize(T input) } } -public class MsgPack_v2 : SerializerBase +public class MessagePack_v2 : SerializerBase { public override T Deserialize(object input) { @@ -29,7 +29,7 @@ public override object Serialize(T input) } } -public class MsgPackLz4_v1 : SerializerBase +public class MessagePackLz4_v1 : SerializerBase { public override T Deserialize(object input) { @@ -42,7 +42,7 @@ public override object Serialize(T input) } } -public class MsgPackLz4_v2 : SerializerBase +public class MessagePackLz4_v2 : SerializerBase { public override T Deserialize(object input) { From e2d3a67edc7090ba89ceba31264ded4102862e5e Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Sun, 10 Mar 2019 22:46:38 +0900 Subject: [PATCH 062/105] Add CerasSerializer Benchmark --- benchmark/SerializerBenchmark/Program.cs | 1 + .../SerializerBenchmark/SerializerBenchmark.cs | 6 ++++-- .../SerializerBenchmark.csproj | 1 + .../Serializers/CerasSerializer.cs | 16 ++++++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 benchmark/SerializerBenchmark/Serializers/CerasSerializer.cs diff --git a/benchmark/SerializerBenchmark/Program.cs b/benchmark/SerializerBenchmark/Program.cs index 73b95297e..4ad5bf658 100644 --- a/benchmark/SerializerBenchmark/Program.cs +++ b/benchmark/SerializerBenchmark/Program.cs @@ -8,6 +8,7 @@ class Program static void Main(string[] args) { BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); + // BenchmarkRunner.Run(); } } } diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.cs b/benchmark/SerializerBenchmark/SerializerBenchmark.cs index f6fa04c9d..a22c1d558 100644 --- a/benchmark/SerializerBenchmark/SerializerBenchmark.cs +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.cs @@ -30,7 +30,8 @@ public class AllSerializerBenchmark_BytesInOut new SpanJson_(), new Utf8Json_(), new MsgPackCli(), - new FsPickler_() + new FsPickler_(), + new Ceras_(), }; protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); @@ -862,7 +863,8 @@ public class ShortRun_AllSerializerBenchmark_BytesInOut new SpanJson_(), new Utf8Json_(), new MsgPackCli(), - new FsPickler_() + new FsPickler_(), + new Ceras_(), }; protected static readonly ExpressionTreeFixture ExpressionTreeFixture = new ExpressionTreeFixture(); diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.csproj b/benchmark/SerializerBenchmark/SerializerBenchmark.csproj index 14700dafc..7f857bfc5 100644 --- a/benchmark/SerializerBenchmark/SerializerBenchmark.csproj +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.csproj @@ -17,6 +17,7 @@ + diff --git a/benchmark/SerializerBenchmark/Serializers/CerasSerializer.cs b/benchmark/SerializerBenchmark/Serializers/CerasSerializer.cs new file mode 100644 index 000000000..a8fb7944f --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/CerasSerializer.cs @@ -0,0 +1,16 @@ +using Benchmark.Serializers; + +public class Ceras_ : SerializerBase +{ + Ceras.CerasSerializer ceras = new Ceras.CerasSerializer(); + + public override T Deserialize(object input) + { + return ceras.Deserialize((byte[])input); + } + + public override object Serialize(T input) + { + return ceras.Serialize(input); + } +} From 02312922213630be3b81a3ac5d2096199cf08d66 Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Sun, 10 Mar 2019 22:50:11 +0900 Subject: [PATCH 063/105] Rename Benchmark, Protobuf -> ProtobufNet --- benchmark/SerializerBenchmark/SerializerBenchmark.cs | 4 ++-- .../SerializerBenchmark/Serializers/ProtobufSerializer.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.cs b/benchmark/SerializerBenchmark/SerializerBenchmark.cs index a22c1d558..b80f8bcb1 100644 --- a/benchmark/SerializerBenchmark/SerializerBenchmark.cs +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.cs @@ -21,7 +21,7 @@ public class AllSerializerBenchmark_BytesInOut new MessagePack_v2(), new MessagePackLz4_v1(), new MessagePackLz4_v2(), - new Protobuf(), + new ProtobufNet(), new JsonNet(), new BinaryFormatter_(), new DataContract_(), @@ -854,7 +854,7 @@ public class ShortRun_AllSerializerBenchmark_BytesInOut new MessagePack_v2(), new MessagePackLz4_v1(), new MessagePackLz4_v2(), - new Protobuf(), + new ProtobufNet(), new JsonNet(), new BinaryFormatter_(), new DataContract_(), diff --git a/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs b/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs index eab51f636..00381992a 100644 --- a/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs +++ b/benchmark/SerializerBenchmark/Serializers/ProtobufSerializer.cs @@ -2,7 +2,7 @@ using ProtoBuf; using System.IO; -public class Protobuf : SerializerBase +public class ProtobufNet : SerializerBase { public override T Deserialize(object input) { From 1ab6f5029b6e3480a4969bf56979f1bc5fb8236f Mon Sep 17 00:00:00 2001 From: Yoshifumi Kawai Date: Mon, 11 Mar 2019 00:13:49 +0900 Subject: [PATCH 064/105] Add DataSize column to Benchmark --- .../SerializerBenchmark/BenchmarkConfig.cs | 90 +++++++++++++++++++ benchmark/SerializerBenchmark/Program.cs | 3 +- .../Serializers/HagarSerializer.cs | 56 ++++++++++++ 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 benchmark/SerializerBenchmark/Serializers/HagarSerializer.cs diff --git a/benchmark/SerializerBenchmark/BenchmarkConfig.cs b/benchmark/SerializerBenchmark/BenchmarkConfig.cs index 4e72a9853..c88d5d3a1 100644 --- a/benchmark/SerializerBenchmark/BenchmarkConfig.cs +++ b/benchmark/SerializerBenchmark/BenchmarkConfig.cs @@ -1,4 +1,5 @@ using Benchmark.Serializers; +using BenchmarkDotNet.Columns; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Environments; @@ -8,6 +9,7 @@ using BenchmarkDotNet.Order; using BenchmarkDotNet.Reports; using BenchmarkDotNet.Running; +using System; using System.Collections.Generic; using System.Linq; @@ -27,6 +29,8 @@ public BenchmarkConfig() Add(CsvExporter.Default); Add(MemoryDiagnoser.Default); + Add(new DataSizeColumn()); + this.Set(new CustomOrderer()); } @@ -64,5 +68,91 @@ public IEnumerable GetSummaryOrder(BenchmarkCase[] benchmarksCase .ThenBy(x => x.Parameters.Items.Select(y => y.Value).OfType().First().GetType().Name); } } + + public class DataSizeColumn : IColumn + { + public string Id => "DataSize"; + + public string ColumnName => "DataSize"; + + public bool AlwaysShow => true; + + public ColumnCategory Category => ColumnCategory.Custom; + + public int PriorityInCategory => int.MaxValue; + + public bool IsNumeric => true; + + public UnitType UnitType => UnitType.Size; + + public string Legend => null; + + public string GetValue(Summary summary, BenchmarkCase benchmarkCase) + { + return GetValue(summary, benchmarkCase, null); + } + + public string GetValue(Summary summary, BenchmarkCase benchmarkCase, ISummaryStyle style) + { + var mi = benchmarkCase.Descriptor.WorkloadMethod; + if (mi.Name.Contains("Serialize")) + { + var instance = Activator.CreateInstance(mi.DeclaringType); + mi.DeclaringType.GetField("Serializer").SetValue(instance, benchmarkCase.Parameters[0].Value); + + var bytes = (byte[])mi.Invoke(instance, null); + return ToHumanReadableSize(bytes.Length); + } + else + { + return "-"; + } + } + + public bool IsAvailable(Summary summary) + { + return true; + } + + public bool IsDefault(Summary summary, BenchmarkCase benchmarkCase) + { + return false; + } + + static string ToHumanReadableSize(long size) + { + return ToHumanReadableSize(new Nullable(size)); + } + + static string ToHumanReadableSize(long? size) + { + if (size == null) return "NULL"; + + double bytes = size.Value; + + if (bytes <= 1024) return bytes.ToString("f2") + " B"; + + bytes = bytes / 1024; + if (bytes <= 1024) return bytes.ToString("f2") + " KB"; + + bytes = bytes / 1024; + if (bytes <= 1024) return bytes.ToString("f2") + " MB"; + + bytes = bytes / 1024; + if (bytes <= 1024) return bytes.ToString("f2") + " GB"; + + bytes = bytes / 1024; + if (bytes <= 1024) return bytes.ToString("f2") + " TB"; + + bytes = bytes / 1024; + if (bytes <= 1024) return bytes.ToString("f2") + " PB"; + + bytes = bytes / 1024; + if (bytes <= 1024) return bytes.ToString("f2") + " EB"; + + bytes = bytes / 1024; + return bytes + " ZB"; + } + } } } diff --git a/benchmark/SerializerBenchmark/Program.cs b/benchmark/SerializerBenchmark/Program.cs index 4ad5bf658..3a5042802 100644 --- a/benchmark/SerializerBenchmark/Program.cs +++ b/benchmark/SerializerBenchmark/Program.cs @@ -1,4 +1,5 @@ using Benchmark; +using Benchmark.Models; using BenchmarkDotNet.Running; namespace ConsoleApp1 @@ -8,7 +9,7 @@ class Program static void Main(string[] args) { BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); - // BenchmarkRunner.Run(); + //BenchmarkRunner.Run(); } } } diff --git a/benchmark/SerializerBenchmark/Serializers/HagarSerializer.cs b/benchmark/SerializerBenchmark/Serializers/HagarSerializer.cs new file mode 100644 index 000000000..06ca15eef --- /dev/null +++ b/benchmark/SerializerBenchmark/Serializers/HagarSerializer.cs @@ -0,0 +1,56 @@ +//using Benchmark.Serializers; +//using System.Buffers; +//using Hagar; +//using Hagar.Buffers; +//using Hagar.Session; +//using Microsoft.Extensions.DependencyInjection; +//using System.IO.Pipelines; + +//public class Hagar_ : SerializerBase +//{ +// readonly ServiceProvider serviceProvider; + +// public Hagar_() +// { +// this.serviceProvider = new ServiceCollection() +// .AddHagar() +// .AddISerializableSupport() +// .AddSerializers(typeof(Hagar_).Assembly) // this assembly +// .BuildServiceProvider(); +// } + +// public override T Deserialize(object input) +// { +// var serializer = serviceProvider.GetRequiredService>(); +// var sessionPool = serviceProvider.GetRequiredService(); + +// var pipe = new Pipe(); +// pipe.Writer.WriteAsync((byte[])input).GetAwaiter().GetResult(); +// pipe.Writer.Complete(); + +// using (var session = sessionPool.GetSession()) +// { +// pipe.Reader.TryRead(out var readResult); +// var reader = new Reader(readResult.Buffer, session); +// var result = serializer.Deserialize(ref reader); +// return result; +// } +// } + +// public override object Serialize(T input) +// { +// var serializer = serviceProvider.GetRequiredService>(); +// var sessionPool = serviceProvider.GetRequiredService(); + +// var pipe = new Pipe(); + +// using (var session = sessionPool.GetSession()) +// { +// var writer = pipe.Writer.CreateWriter(session); +// serializer.Serialize(ref writer, input); +// pipe.Writer.Complete(); +// pipe.Reader.TryRead(out var result); +// return result.Buffer.ToArray(); +// } +// } +//} From b6f5f80cfafc242699b4ae550279d45f2debd096 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 18 Feb 2019 09:04:13 -0800 Subject: [PATCH 065/105] Avoid allocating too much memory --- src/MessagePack/MessagePackBinary.cs | 53 +++++++++++++++++-- .../MessagePackBinaryTest.cs | 46 +++++++++++++--- 2 files changed, 87 insertions(+), 12 deletions(-) diff --git a/src/MessagePack/MessagePackBinary.cs b/src/MessagePack/MessagePackBinary.cs index bc3cbd786..bbc52475f 100644 --- a/src/MessagePack/MessagePackBinary.cs +++ b/src/MessagePack/MessagePackBinary.cs @@ -747,7 +747,16 @@ public static int ReadMapHeader(byte[] bytes, int offset, out int readSize) { checked { - return (int)mapHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + int count = (int)mapHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + // We allow for each primitive to be the minimal 1 byte in size, and we have a key=value map, so that's 2 bytes. + if (count * 2 > bytes.Length - offset) + { + ThrowNotEnoughBytesException(); + } + + return count; } } @@ -759,7 +768,16 @@ public static int ReadMapHeader(byte[] bytes, int offset, out int readSize) #endif public static uint ReadMapHeaderRaw(byte[] bytes, int offset, out int readSize) { - return mapHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + uint count = mapHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + // We allow for each primitive to be the minimal 1 byte in size, and we have a key=value map, so that's 2 bytes. + if (count * 2 > bytes.Length - offset) + { + ThrowNotEnoughBytesException(); + } + + return count; } #if NETSTANDARD @@ -879,10 +897,21 @@ public static int ReadArrayHeader(byte[] bytes, int offset, out int readSize) { checked { - return (int)arrayHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + int count = (int)arrayHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + // We allow for each primitive to be the minimal 1 byte in size. + // Formatters that know each element is larger can double-check our work. + if (count > bytes.Length - offset) + { + ThrowNotEnoughBytesException(); + } + + return count; } } + /// /// Return array count. /// @@ -891,7 +920,17 @@ public static int ReadArrayHeader(byte[] bytes, int offset, out int readSize) #endif public static uint ReadArrayHeaderRaw(byte[] bytes, int offset, out int readSize) { - return arrayHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + uint count = arrayHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + // We allow for each primitive to be the minimal 1 byte in size. + // Formatters that know each element is larger can double-check our work. + if (count > bytes.Length - offset) + { + ThrowNotEnoughBytesException(); + } + + return count; } #if NETSTANDARD @@ -2282,6 +2321,12 @@ public static DateTime ReadDateTime(byte[] bytes, int offset, out int readSize) { return dateTimeDecoders[bytes[offset]].Read(bytes, offset, out readSize); } + + /// + /// Throws an exception indicating that there aren't enough bytes remaining in the buffer to store + /// the promised data. + /// + private static void ThrowNotEnoughBytesException() => throw new EndOfStreamException(); } // Stream Overload diff --git a/tests/MessagePack.Tests/MessagePackBinaryTest.cs b/tests/MessagePack.Tests/MessagePackBinaryTest.cs index 66c3a9d70..dac5c717c 100644 --- a/tests/MessagePack.Tests/MessagePackBinaryTest.cs +++ b/tests/MessagePack.Tests/MessagePackBinaryTest.cs @@ -350,16 +350,15 @@ public void Int64Test(long target, int length) [InlineData(20000, 3)] [InlineData(ushort.MaxValue, 3)] [InlineData(80000, 5)] - [InlineData(int.MaxValue, 5)] public void MapHeaderTest(uint target, int length) { (var stream, var packer) = CreateReferencePacker(); - byte[] bytes = null; + byte[] bytes = new byte[length + target * 2]; MessagePackBinary.WriteMapHeader(ref bytes, 0, target).Is(length); - packer.PackMapHeader((int)target).Position.Is(bytes.Length); - stream.ToArray().SequenceEqual(bytes).IsTrue(); + packer.PackMapHeader((int)target).Position.Is(length); + stream.ToArray().SequenceEqual(bytes.Take(length)).IsTrue(); int readSize; MessagePackBinary.ReadMapHeaderRaw(bytes, 0, out readSize).Is(target); @@ -385,16 +384,15 @@ public void MapHeaderTest(uint target, int length) [InlineData(20000, 3)] [InlineData(ushort.MaxValue, 3)] [InlineData(80000, 5)] - [InlineData(int.MaxValue, 5)] public void ArrayHeaderTest(uint target, int length) { (var stream, var packer) = CreateReferencePacker(); - byte[] bytes = null; + byte[] bytes = new byte[length + target]; MessagePackBinary.WriteArrayHeader(ref bytes, 0, target).Is(length); - packer.PackArrayHeader((int)target).Position.Is(bytes.Length); - stream.ToArray().SequenceEqual(bytes).IsTrue(); + packer.PackArrayHeader((int)target).Position.Is(length); + stream.ToArray().SequenceEqual(bytes.Take(length)).IsTrue(); int readSize; MessagePackBinary.ReadArrayHeaderRaw(bytes, 0, out readSize).Is(target); @@ -734,5 +732,37 @@ public void IntegerRangeTest() target.SequenceEqual(small).IsTrue(); } } + + [Fact] + public void ReadArrayHeader_MitigatesLargeAllocations() + { + byte[] bytes = null; + int count = MessagePackBinary.WriteArrayHeader(ref bytes, 0, 9999); + Assert.Throws(() => MessagePackBinary.ReadArrayHeader(bytes, 0, out int readSize)); + } + + [Fact] + public void ReadArrayHeaderRaw_MitigatesLargeAllocations() + { + byte[] bytes = null; + int count = MessagePackBinary.WriteArrayHeader(ref bytes, 0, 9999); + Assert.Throws(() => MessagePackBinary.ReadArrayHeaderRaw(bytes, 0, out int readSize)); + } + + [Fact] + public void ReadMapHeader_MitigatesLargeAllocations() + { + byte[] bytes = null; + int count = MessagePackBinary.WriteMapHeader(ref bytes, 0, 9999); + Assert.Throws(() => MessagePackBinary.ReadMapHeader(bytes, 0, out int readSize)); + } + + [Fact] + public void ReadMapHeaderRaw_MitigatesLargeAllocations() + { + byte[] bytes = null; + int count = MessagePackBinary.WriteMapHeader(ref bytes, 0, 9999); + Assert.Throws(() => MessagePackBinary.ReadMapHeaderRaw(bytes, 0, out int readSize)); + } } } From cf5a6b4a36d88b6470ea0cc03935ca178f13dd67 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 19 Feb 2019 10:02:02 -0800 Subject: [PATCH 066/105] Add array length protection to Bin and Ext types --- src/MessagePack/MessagePackBinary.cs | 41 +++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/MessagePack/MessagePackBinary.cs b/src/MessagePack/MessagePackBinary.cs index bbc52475f..0a1fe233a 100644 --- a/src/MessagePack/MessagePackBinary.cs +++ b/src/MessagePack/MessagePackBinary.cs @@ -2326,7 +2326,7 @@ public static DateTime ReadDateTime(byte[] bytes, int offset, out int readSize) /// Throws an exception indicating that there aren't enough bytes remaining in the buffer to store /// the promised data. /// - private static void ThrowNotEnoughBytesException() => throw new EndOfStreamException(); + internal static void ThrowNotEnoughBytesException() => throw new EndOfStreamException(); } // Stream Overload @@ -3715,6 +3715,13 @@ internal sealed class Bin8Bytes : IBytesDecoder public byte[] Read(byte[] bytes, int offset, out int readSize) { var length = bytes[offset + 1]; + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + if (length > bytes.Length - offset) + { + MessagePackBinary.ThrowNotEnoughBytesException(); + } + var newBytes = new byte[length]; Buffer.BlockCopy(bytes, offset + 2, newBytes, 0, length); @@ -3735,6 +3742,13 @@ internal sealed class Bin16Bytes : IBytesDecoder public byte[] Read(byte[] bytes, int offset, out int readSize) { var length = (bytes[offset + 1] << 8) + (bytes[offset + 2]); + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + if (length > bytes.Length - offset) + { + MessagePackBinary.ThrowNotEnoughBytesException(); + } + var newBytes = new byte[length]; Buffer.BlockCopy(bytes, offset + 3, newBytes, 0, length); @@ -3755,6 +3769,13 @@ internal sealed class Bin32Bytes : IBytesDecoder public byte[] Read(byte[] bytes, int offset, out int readSize) { var length = (bytes[offset + 1] << 24) | (bytes[offset + 2] << 16) | (bytes[offset + 3] << 8) | (bytes[offset + 4]); + + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + if (length > bytes.Length - offset) + { + MessagePackBinary.ThrowNotEnoughBytesException(); + } + var newBytes = new byte[length]; Buffer.BlockCopy(bytes, offset + 5, newBytes, 0, length); @@ -5417,6 +5438,12 @@ public ExtensionResult Read(byte[] bytes, int offset, out int readSize) var length = bytes[offset + 1]; var typeCode = unchecked((sbyte)bytes[offset + 2]); + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + if (length > bytes.Length - offset) + { + MessagePackBinary.ThrowNotEnoughBytesException(); + } + var body = new byte[length]; readSize = (int)length + 3; Buffer.BlockCopy(bytes, offset + 3, body, 0, (int)length); @@ -5441,6 +5468,12 @@ public ExtensionResult Read(byte[] bytes, int offset, out int readSize) var length = (int)((UInt16)(bytes[offset + 1] << 8) | (UInt16)bytes[offset + 2]); var typeCode = unchecked((sbyte)bytes[offset + 3]); + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + if (length > bytes.Length - offset) + { + MessagePackBinary.ThrowNotEnoughBytesException(); + } + var body = new byte[length]; readSize = length + 4; Buffer.BlockCopy(bytes, offset + 4, body, 0, (int)length); @@ -5465,6 +5498,12 @@ public ExtensionResult Read(byte[] bytes, int offset, out int readSize) var length = (UInt32)((UInt32)(bytes[offset + 1] << 24) | (UInt32)(bytes[offset + 2] << 16) | (UInt32)(bytes[offset + 3] << 8) | (UInt32)bytes[offset + 4]); var typeCode = unchecked((sbyte)bytes[offset + 5]); + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + if (length > bytes.Length - offset) + { + MessagePackBinary.ThrowNotEnoughBytesException(); + } + var body = new byte[length]; checked { From f9b41f3157d475782f24c85144c44000366d6c06 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 7 Mar 2019 20:57:00 -0800 Subject: [PATCH 067/105] Fix Stream reading functional regression and secure "strict" reads The mitigation is only effective when Stream.CanSeek == true. --- src/MessagePack/MessagePackBinary.cs | 38 +++++++++++++++++-- .../MessagePackBinaryTest.cs | 21 ++++++++++ tests/MessagePack.Tests/StreamStrictTest.cs | 2 +- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/MessagePack/MessagePackBinary.cs b/src/MessagePack/MessagePackBinary.cs index 0a1fe233a..c0562f1b9 100644 --- a/src/MessagePack/MessagePackBinary.cs +++ b/src/MessagePack/MessagePackBinary.cs @@ -767,12 +767,17 @@ public static int ReadMapHeader(byte[] bytes, int offset, out int readSize) [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadMapHeaderRaw(byte[] bytes, int offset, out int readSize) + { + return ReadMapHeaderRaw(bytes, offset, checked((uint)(bytes.Length - offset)), out readSize); + } + + private static uint ReadMapHeaderRaw(byte[] bytes, int offset, uint remainingBytes, out int readSize) { uint count = mapHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); // Protected against corrupted or mischievious data that may lead to allocating way too much memory. // We allow for each primitive to be the minimal 1 byte in size, and we have a key=value map, so that's 2 bytes. - if (count * 2 > bytes.Length - offset) + if (count * 2 > remainingBytes - readSize) { ThrowNotEnoughBytesException(); } @@ -919,13 +924,18 @@ public static int ReadArrayHeader(byte[] bytes, int offset, out int readSize) [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif public static uint ReadArrayHeaderRaw(byte[] bytes, int offset, out int readSize) + { + return ReadArrayHeaderRaw(bytes, offset, checked((uint)(bytes.Length - offset)), out readSize); + } + + private static uint ReadArrayHeaderRaw(byte[] bytes, int offset, uint remainingBytes, out int readSize) { uint count = arrayHeaderDecoders[bytes[offset]].Read(bytes, offset, out readSize); // Protected against corrupted or mischievious data that may lead to allocating way too much memory. // We allow for each primitive to be the minimal 1 byte in size. // Formatters that know each element is larger can double-check our work. - if (count > bytes.Length - offset) + if (count > remainingBytes - readSize) { ThrowNotEnoughBytesException(); } @@ -2424,6 +2434,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o if (MessagePackCode.MinFixStr <= code && code <= MessagePackCode.MaxFixStr) { var length = bytes[offset] & 0x1F; + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 1 + length); ReadFully(stream, bytes, offset + 1, length); return length + 1; @@ -2437,6 +2448,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o ReadFully(stream, bytes, offset + 1, 1); var length = bytes[offset + 1]; + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 2 + length); ReadFully(stream, bytes, offset + 2, length); @@ -2448,6 +2460,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o ReadFully(stream, bytes, offset + 1, 2); var length = (bytes[offset + 1] << 8) + (bytes[offset + 2]); + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 3 + length); ReadFully(stream, bytes, offset + 3, length); @@ -2459,6 +2472,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o ReadFully(stream, bytes, offset + 1, 4); var length = (bytes[offset + 1] << 24) | (bytes[offset + 2] << 16) | (bytes[offset + 3] << 8) | (bytes[offset + 4]); + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 5 + length); ReadFully(stream, bytes, offset + 5, length); @@ -2477,6 +2491,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o ReadFully(stream, bytes, offset + 1, 1); var length = bytes[offset + 1]; + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 2 + length); ReadFully(stream, bytes, offset + 2, length); @@ -2488,6 +2503,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o ReadFully(stream, bytes, offset + 1, 2); var length = (bytes[offset + 1] << 8) + (bytes[offset + 2]); + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 3 + length); ReadFully(stream, bytes, offset + 3, length); @@ -2499,6 +2515,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o ReadFully(stream, bytes, offset + 1, 4); var length = (bytes[offset + 1] << 24) | (bytes[offset + 2] << 16) | (bytes[offset + 3] << 8) | (bytes[offset + 4]); + ThrowIfNotEnoughBytesRemaining(stream, length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 5 + length); ReadFully(stream, bytes, offset + 5, length); @@ -2522,9 +2539,10 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o var startOffset = offset; offset += (readHeaderSize + 1); + uint remainingBytes = stream.CanSeek ? (uint)(stream.Length - startOffset) : uint.MaxValue; int _; - var length = ReadArrayHeaderRaw(bytes, startOffset, out _); + var length = ReadArrayHeaderRaw(bytes, startOffset, remainingBytes, out _); if (!readOnlySingleMessage) { for (int i = 0; i < length; i++) @@ -2550,9 +2568,10 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o var startOffset = offset; offset += (readHeaderSize + 1); + uint remainingBytes = stream.CanSeek ? (uint)(stream.Length - startOffset) : uint.MaxValue; int _; - var length = ReadMapHeaderRaw(bytes, startOffset, out _); + var length = ReadMapHeaderRaw(bytes, startOffset, remainingBytes, out _); if (!readOnlySingleMessage) { for (int i = 0; i < length; i++) @@ -2589,6 +2608,7 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o int _; var header = ReadExtensionFormatHeader(bytes, offset, out _); + ThrowIfNotEnoughBytesRemaining(stream, (int)header.Length); MessagePackBinary.EnsureCapacity(ref bytes, offset, 1 + readHeaderSize + (int)header.Length); ReadFully(stream, bytes, offset + 1 + readHeaderSize, (int)header.Length); @@ -2603,6 +2623,16 @@ static int ReadMessageBlockFromStreamCore(Stream stream, ref byte[] bytes, int o } } + private static void ThrowIfNotEnoughBytesRemaining(Stream stream, int length) + { + // Protected against corrupted or mischievious data that may lead to allocating way too much memory. + // For streams, we can only predict length when the streams are seekable. + if (stream.CanSeek && length > stream.Length - stream.Position) + { + ThrowNotEnoughBytesException(); + } + } + static void ReadFully(Stream stream, byte[] bytes, int offset, int readSize) { var nextLen = readSize; diff --git a/tests/MessagePack.Tests/MessagePackBinaryTest.cs b/tests/MessagePack.Tests/MessagePackBinaryTest.cs index dac5c717c..faaba6ae5 100644 --- a/tests/MessagePack.Tests/MessagePackBinaryTest.cs +++ b/tests/MessagePack.Tests/MessagePackBinaryTest.cs @@ -3,6 +3,7 @@ using System.IO; using Xunit; using System.Text; +using System.Collections.Generic; namespace MessagePack.Tests { @@ -764,5 +765,25 @@ public void ReadMapHeaderRaw_MitigatesLargeAllocations() int count = MessagePackBinary.WriteMapHeader(ref bytes, 0, 9999); Assert.Throws(() => MessagePackBinary.ReadMapHeaderRaw(bytes, 0, out int readSize)); } + + [Fact] + public void DeserializeLargeArray_Stream_WithLargePayload() + { + int[] expected = new int[128 * 1024]; + byte[] buffer = MessagePackSerializer.Serialize(expected); // something larger than the 64KB default buffer size + MemoryStream ms = new MemoryStream(buffer); + var actual = MessagePackSerializer.Deserialize(ms, readStrict: true); + Assert.Equal(expected, actual); + } + + [Fact] + public void DeserializeLargeMap_Stream_WithLargePayload() + { + var expected = Enumerable.Range(0, 128 * 1024).ToDictionary(n => n); + byte[] buffer = MessagePackSerializer.Serialize(expected); // something larger than the 64KB default buffer size + MemoryStream ms = new MemoryStream(buffer); + var actual = MessagePackSerializer.Deserialize>(ms, readStrict: true); + Assert.Equal(expected.Count, actual.Count); + } } } diff --git a/tests/MessagePack.Tests/StreamStrictTest.cs b/tests/MessagePack.Tests/StreamStrictTest.cs index 44882cf05..32b864957 100644 --- a/tests/MessagePack.Tests/StreamStrictTest.cs +++ b/tests/MessagePack.Tests/StreamStrictTest.cs @@ -105,7 +105,7 @@ public FixedSizeReadStream(Stream stream, int readSize) public override bool CanRead => throw new NotImplementedException(); - public override bool CanSeek => throw new NotImplementedException(); + public override bool CanSeek => false; public override bool CanWrite => throw new NotImplementedException(); From 17d3cbcc795b262b14d7ea9dba19046172996254 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 7 Mar 2019 21:09:10 -0800 Subject: [PATCH 068/105] Allow to mitigate allocation size for non-seekable streams --- src/MessagePack/MessagePackBinary.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/MessagePack/MessagePackBinary.cs b/src/MessagePack/MessagePackBinary.cs index c0562f1b9..67d28e135 100644 --- a/src/MessagePack/MessagePackBinary.cs +++ b/src/MessagePack/MessagePackBinary.cs @@ -248,6 +248,17 @@ static MessagePackBinary() dateTimeDecoders[MessagePackCode.Ext8] = Decoders.Ext8DateTime.Instance; } + /// + /// A maximum allowable element count for any array or map allocated by this class + /// when reading from non-seekable streams. + /// The default is . + /// + /// + /// When reading from a byte array or seekable streams, the actual length + /// of the remaining buffer or stream is used to calculate a safe limit. + /// + public static int MaxArrayAllocationSize = int.MaxValue; + #if NETSTANDARD [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] #endif @@ -2627,7 +2638,8 @@ private static void ThrowIfNotEnoughBytesRemaining(Stream stream, int length) { // Protected against corrupted or mischievious data that may lead to allocating way too much memory. // For streams, we can only predict length when the streams are seekable. - if (stream.CanSeek && length > stream.Length - stream.Position) + int upperLimit = stream.CanSeek ? checked((int)(stream.Length - stream.Position)) : MaxArrayAllocationSize; + if (stream.CanSeek && length > upperLimit) { ThrowNotEnoughBytesException(); } From 6725bc5e6f06f60d18093b266f44c084558cbf3d Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 16 Mar 2019 10:27:20 -0700 Subject: [PATCH 069/105] Enable ETL collection in SerializerBenchmark --- benchmark/SerializerBenchmark/SerializerBenchmark.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/SerializerBenchmark/SerializerBenchmark.csproj b/benchmark/SerializerBenchmark/SerializerBenchmark.csproj index 7f857bfc5..ebcd6fe3d 100644 --- a/benchmark/SerializerBenchmark/SerializerBenchmark.csproj +++ b/benchmark/SerializerBenchmark/SerializerBenchmark.csproj @@ -16,6 +16,7 @@ + From c64281af4e1785964509a3b62eec9427cc62968c Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 23 Mar 2019 21:34:48 -0700 Subject: [PATCH 070/105] Fix compilation break in Unity --- src/MessagePack/IFormatterResolver.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MessagePack/IFormatterResolver.cs b/src/MessagePack/IFormatterResolver.cs index 81937d8ec..a7e07abff 100644 --- a/src/MessagePack/IFormatterResolver.cs +++ b/src/MessagePack/IFormatterResolver.cs @@ -2,7 +2,6 @@ using MessagePack.Formatters; using System; using System.Reflection; -using System.Runtime.ExceptionServices; namespace MessagePack { @@ -22,11 +21,16 @@ public static IMessagePackFormatter GetFormatterWithVerify(this IFormatter } catch (TypeInitializationException ex) { +#if NETSTANDARD || NETFRAMEWORK // The fact that we're using static constructors to initialize this is an internal detail. // Rethrow the inner exception if there is one. // Do it carefully so as to not stomp on the original callstack. ExceptionDispatchInfo.Capture(ex.InnerException ?? ex).Throw(); throw new InvalidOperationException("Unreachable"); // keep the compiler happy +#else + var data = ex.Data; // suppress warning about not using `ex` + throw; +#endif } if (formatter == null) From 2023f29b2b07b78e815b6cec0d3cb87503e12b46 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 25 Mar 2019 07:08:57 -0700 Subject: [PATCH 071/105] Fix build break --- src/MessagePack/IFormatterResolver.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MessagePack/IFormatterResolver.cs b/src/MessagePack/IFormatterResolver.cs index a7e07abff..291183524 100644 --- a/src/MessagePack/IFormatterResolver.cs +++ b/src/MessagePack/IFormatterResolver.cs @@ -25,7 +25,7 @@ public static IMessagePackFormatter GetFormatterWithVerify(this IFormatter // The fact that we're using static constructors to initialize this is an internal detail. // Rethrow the inner exception if there is one. // Do it carefully so as to not stomp on the original callstack. - ExceptionDispatchInfo.Capture(ex.InnerException ?? ex).Throw(); + System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex.InnerException ?? ex).Throw(); throw new InvalidOperationException("Unreachable"); // keep the compiler happy #else var data = ex.Data; // suppress warning about not using `ex` @@ -60,4 +60,4 @@ public FormatterNotRegisteredException(string message) : base(message) { } } -} \ No newline at end of file +} From 72b2bbe2779c304f0a59c88d249bca3ed6a50f1e Mon Sep 17 00:00:00 2001 From: Thibaut Le Guilly Date: Wed, 27 Mar 2019 11:34:30 +0900 Subject: [PATCH 072/105] Allow using attributed derived from MessagePackObject on child classes --- .../Resolvers/DynamicObjectResolver.cs | 2 +- ...ResolverDerivedAttributeInheritanceTest.cs | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tests/MessagePack.Tests/DynamicObjectResolverDerivedAttributeInheritanceTest.cs diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index d9db8d026..3c867b454 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -1316,7 +1316,7 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe var ti = type.GetTypeInfo(); var isClass = ti.IsClass || ti.IsInterface || ti.IsAbstract; - var contractAttr = ti.GetCustomAttribute(); + var contractAttr = ti.GetCustomAttributes().FirstOrDefault(); var dataContractAttr = ti.GetCustomAttribute(); if (contractAttr == null && dataContractAttr == null && !forceStringKey && !contractless) { diff --git a/tests/MessagePack.Tests/DynamicObjectResolverDerivedAttributeInheritanceTest.cs b/tests/MessagePack.Tests/DynamicObjectResolverDerivedAttributeInheritanceTest.cs new file mode 100644 index 000000000..e607eca31 --- /dev/null +++ b/tests/MessagePack.Tests/DynamicObjectResolverDerivedAttributeInheritanceTest.cs @@ -0,0 +1,61 @@ +using System; +using Xunit; + +namespace MessagePack.Tests +{ + public class DynamicObjectResolverDerivedAttributeInheritanceTest + { + [Fact] + public void InheritanceAndDerivedAttributeTest() + { + var value = new ChildClass(1, "Hello", 2); + var serialized = MessagePackSerializer.Serialize(value); + var deserialized = + MessagePackSerializer.Deserialize(serialized); + deserialized.OtherValue.Is(value.OtherValue); + deserialized.Text.Is(value.Text); + deserialized.Value.Is(value.Value); + } + } + + [MessagePackObject] + public abstract class BaseClass + { + public BaseClass(int value, string text) + { + Value = value; + Text = text; + } + + [Key(0)] + public int Value { get; } + + [Key(1)] + public string Text { get; } + } + + [Message(1)] + public class ChildClass : BaseClass + { + public ChildClass(int value, string text, int otherValue) : base( + value, + text) + { + OtherValue = otherValue; + } + + [Key(2)] + public int OtherValue { get; } + } + + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + class MessageAttribute : MessagePackObjectAttribute + { + public MessageAttribute(short version) + { + Version = version; + } + + public short Version { get; } + } +} From 612d46b184ed6cb2463ffc0395c43dae3f02999a Mon Sep 17 00:00:00 2001 From: Thibaut Le Guilly Date: Fri, 29 Mar 2019 09:13:36 +0900 Subject: [PATCH 073/105] Allow parent interface in constructor --- .../Resolvers/DynamicObjectResolver.cs | 4 ++- .../DynamicObjectResolverInterfaceTest.cs | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/MessagePack.Tests/DynamicObjectResolverInterfaceTest.cs diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index d9db8d026..516bb62e1 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -1593,7 +1593,9 @@ public static ObjectSerializationInfo CreateOrNull(Type type, bool forceStringKe { if (intMembers.TryGetValue(ctorParamIndex, out paramMember)) { - if (item.ParameterType == paramMember.Type && paramMember.IsReadable) + if ((item.ParameterType == paramMember.Type || + item.ParameterType.GetTypeInfo().IsAssignableFrom(paramMember.Type)) + && paramMember.IsReadable) { constructorParameters.Add(paramMember); } diff --git a/tests/MessagePack.Tests/DynamicObjectResolverInterfaceTest.cs b/tests/MessagePack.Tests/DynamicObjectResolverInterfaceTest.cs new file mode 100644 index 000000000..518681e38 --- /dev/null +++ b/tests/MessagePack.Tests/DynamicObjectResolverInterfaceTest.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace MessagePack.Tests +{ + public class DynamicObjectResolverInterfaceTest + { + [Fact] + void TestConstructorWithParentInterface() + { + var myClass = new ConstructorEnumerableTest(new[] { "0", "2", "3" }); + var serialized = MessagePackSerializer.Serialize(myClass); + var deserialized = + MessagePackSerializer.Deserialize(serialized); + deserialized.Values.IsStructuralEqual(myClass.Values); + } + + } + + [MessagePackObject] + public class ConstructorEnumerableTest + { + [SerializationConstructor] + public ConstructorEnumerableTest(IEnumerable values) + { + Values = values.ToList().AsReadOnly(); + } + + [Key(0)] + public IReadOnlyList Values { get; } + } +} From fceb323b7e5b1249abe93e84880054a8b0e82f6c Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 9 Apr 2019 21:59:06 -0600 Subject: [PATCH 074/105] Fix pack.bat script to run from any directory --- nuget/pack.bat | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/nuget/pack.bat b/nuget/pack.bat index 1d6c5a75e..80c146302 100644 --- a/nuget/pack.bat +++ b/nuget/pack.bat @@ -1,6 +1,6 @@ -nuget pack MessagePack.nuspec -nuget pack MessagePack.ImmutableCollection.nuspec -nuget pack MessagePack.ReactiveProperty.nuspec -nuget pack MessagePack.UnityShims.nuspec -nuget pack MessagePack.AspNetCoreMvcFormatter.nuspec -nuget pack MessagePackAnalyzer.nuspec \ No newline at end of file +nuget pack -OutputDirectory "%~dp0\" %~dp0MessagePack.nuspec +nuget pack -OutputDirectory "%~dp0\" %~dp0MessagePack.ImmutableCollection.nuspec +nuget pack -OutputDirectory "%~dp0\" %~dp0MessagePack.ReactiveProperty.nuspec +nuget pack -OutputDirectory "%~dp0\" %~dp0MessagePack.UnityShims.nuspec +nuget pack -OutputDirectory "%~dp0\" %~dp0MessagePack.AspNetCoreMvcFormatter.nuspec +nuget pack -OutputDirectory "%~dp0\" %~dp0MessagePackAnalyzer.nuspec From 215d34dfa788df86957d127db3907b9702c5917d Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 9 Apr 2019 21:59:33 -0600 Subject: [PATCH 075/105] Fix packaging errors --- nuget/MessagePack.ImmutableCollection.nuspec | 6 ++-- nuget/MessagePack.LZ4.nuspec | 33 ------------------- nuget/MessagePack.ReactiveProperty.nuspec | 8 ++--- nuget/MessagePack.UnityShims.nuspec | 6 ++-- nuget/MessagePack.nuspec | 6 ++-- .../MessagePack.AspNetCoreMvcFormatter.csproj | 7 ++-- .../MessagePack.ImmutableCollection.csproj | 4 +-- .../MessagePack.ReactiveProperty.csproj | 4 +-- .../MessagePack.UnityShims.csproj | 4 +-- src/MessagePack/MessagePack.csproj | 4 +-- 10 files changed, 23 insertions(+), 59 deletions(-) delete mode 100644 nuget/MessagePack.LZ4.nuspec diff --git a/nuget/MessagePack.ImmutableCollection.nuspec b/nuget/MessagePack.ImmutableCollection.nuspec index 8fc124f24..92e32ec2f 100644 --- a/nuget/MessagePack.ImmutableCollection.nuspec +++ b/nuget/MessagePack.ImmutableCollection.nuspec @@ -35,11 +35,11 @@ - + - + - + diff --git a/nuget/MessagePack.LZ4.nuspec b/nuget/MessagePack.LZ4.nuspec deleted file mode 100644 index 18455efa7..000000000 --- a/nuget/MessagePack.LZ4.nuspec +++ /dev/null @@ -1,33 +0,0 @@ - - - - MessagePack.LZ4 - 0.8.2 - Codestin Search App - neuecc - neuecc - https://github.com/neuecc/MessagePack-CSharp/ - false - Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity), LZ4 Compression Support. - Initial LZ4 Extension. - MsgPack, MessagePack, Serialization, Formatter, Serializer, LZ4, Compression - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget/MessagePack.ReactiveProperty.nuspec b/nuget/MessagePack.ReactiveProperty.nuspec index 50b1a5f45..47ddd632e 100644 --- a/nuget/MessagePack.ReactiveProperty.nuspec +++ b/nuget/MessagePack.ReactiveProperty.nuspec @@ -34,13 +34,13 @@ - - + + - + - + \ No newline at end of file diff --git a/nuget/MessagePack.UnityShims.nuspec b/nuget/MessagePack.UnityShims.nuspec index 648e5d8ce..d88aa9f17 100644 --- a/nuget/MessagePack.UnityShims.nuspec +++ b/nuget/MessagePack.UnityShims.nuspec @@ -31,11 +31,11 @@ - + - + - + diff --git a/nuget/MessagePack.nuspec b/nuget/MessagePack.nuspec index f692cb739..bde90cbf0 100644 --- a/nuget/MessagePack.nuspec +++ b/nuget/MessagePack.nuspec @@ -40,12 +40,12 @@ - + - + - + \ No newline at end of file diff --git a/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj b/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj index bbf97fa58..6e7a5ece9 100644 --- a/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj +++ b/src/MessagePack.AspNetCoreMvcFormatter/MessagePack.AspNetCoreMvcFormatter.csproj @@ -5,10 +5,7 @@ True ..\..\opensource.snk false - - - - bin\Release\netstandard2.0\MessagePack.AspNetCoreMvcFormatter.xml + true @@ -19,4 +16,4 @@ - \ No newline at end of file + diff --git a/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj b/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj index 832d13ebc..9a806fd91 100644 --- a/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj +++ b/src/MessagePack.ImmutableCollection/MessagePack.ImmutableCollection.csproj @@ -5,10 +5,10 @@ True ..\..\opensource.snk false + true - bin\Release\netstandard2.0\MessagePack.ImmutableCollection.xml 1701;1702;1705;1591 @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj index ad8d2db1c..fed0e730d 100644 --- a/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj +++ b/src/MessagePack.ReactiveProperty/MessagePack.ReactiveProperty.csproj @@ -5,10 +5,10 @@ True ..\..\opensource.snk false + true - bin\Release\netstandard2.0\MessagePack.ReactiveProperty.xml 1701;1702;1705;1591 @@ -49,4 +49,4 @@ - \ No newline at end of file + diff --git a/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj b/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj index ad3609e1e..80ddce9a0 100644 --- a/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj +++ b/src/MessagePack.UnityShims/MessagePack.UnityShims.csproj @@ -6,11 +6,11 @@ True ..\..\opensource.snk false + true True - bin\Release\netstandard2.0\MessagePack.UnityShims.xml 1701;1702;1705;1591 TRACE;RELEASE;NETSTANDARD;ENABLE_UNSAFE_MSGPACK @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index 5cb9f544b..c384dc0b3 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -6,6 +6,7 @@ True ..\..\opensource.snk false + true @@ -17,7 +18,6 @@ True - bin\Release\netstandard2.0\MessagePack.xml 1701;1702;1705;1591 TRACE;RELEASE;NETSTANDARD;ENABLE_UNSAFE_MSGPACK; True @@ -131,4 +131,4 @@ True - \ No newline at end of file + From 10fea6a043eb1f5d984180e52df6c3808899bd8a Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 9 Apr 2019 21:48:46 -0600 Subject: [PATCH 076/105] Bump version built to 1.7.3.7 --- nuget/MessagePack.AspNetCoreMvcFormatter.nuspec | 8 ++++---- nuget/MessagePack.ImmutableCollection.nuspec | 12 ++++++------ nuget/MessagePack.ReactiveProperty.nuspec | 12 ++++++------ nuget/MessagePack.UnityShims.nuspec | 12 ++++++------ nuget/MessagePack.nuspec | 4 ++-- nuget/MessagePackAnalyzer.nuspec | 4 ++-- nuget/push.bat | 12 ++++++------ .../_AssemblyInfo.cs | 4 ++-- src/MessagePack.ImmutableCollection/_AssemblyInfo.cs | 4 ++-- src/MessagePack.ReactiveProperty/_AssemblyInfo.cs | 4 ++-- src/MessagePack.UnityShims/_AssemblyInfo.cs | 4 ++-- src/MessagePack/_AssemblyInfo.cs | 6 +++--- 12 files changed, 43 insertions(+), 43 deletions(-) diff --git a/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec b/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec index 2afefe27f..d6d2c1bfb 100644 --- a/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec +++ b/nuget/MessagePack.AspNetCoreMvcFormatter.nuspec @@ -2,7 +2,7 @@ MessagePack.AspNetCoreMvcFormatter - 1.7.3.4 + 1.7.3.7 Codestin Search App neuecc neuecc @@ -12,11 +12,11 @@ MsgPack, MessagePack, Serialization, Formatter, Serializer, aspnetcore, aspnetcoremvc - + - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/nuget/MessagePack.ImmutableCollection.nuspec b/nuget/MessagePack.ImmutableCollection.nuspec index 92e32ec2f..fbc0f7a56 100644 --- a/nuget/MessagePack.ImmutableCollection.nuspec +++ b/nuget/MessagePack.ImmutableCollection.nuspec @@ -2,7 +2,7 @@ MessagePack.ImmutableCollection - 1.7.3.4 + 1.7.3.7 Codestin Search App neuecc neuecc @@ -16,19 +16,19 @@ - + - + - + - + @@ -43,4 +43,4 @@ - \ No newline at end of file + diff --git a/nuget/MessagePack.ReactiveProperty.nuspec b/nuget/MessagePack.ReactiveProperty.nuspec index 47ddd632e..499e9e352 100644 --- a/nuget/MessagePack.ReactiveProperty.nuspec +++ b/nuget/MessagePack.ReactiveProperty.nuspec @@ -2,7 +2,7 @@ MessagePack.ReactiveProperty - 1.7.3.4 + 1.7.3.7 Codestin Search App neuecc neuecc @@ -16,19 +16,19 @@ - + - + - + - + @@ -43,4 +43,4 @@ - \ No newline at end of file + diff --git a/nuget/MessagePack.UnityShims.nuspec b/nuget/MessagePack.UnityShims.nuspec index d88aa9f17..d8fa22046 100644 --- a/nuget/MessagePack.UnityShims.nuspec +++ b/nuget/MessagePack.UnityShims.nuspec @@ -2,7 +2,7 @@ MessagePack.UnityShims - 1.7.3.4 + 1.7.3.7 Codestin Search App neuecc neuecc @@ -16,16 +16,16 @@ - + - + - + - + @@ -39,4 +39,4 @@ - \ No newline at end of file + diff --git a/nuget/MessagePack.nuspec b/nuget/MessagePack.nuspec index bde90cbf0..f6dbde2b0 100644 --- a/nuget/MessagePack.nuspec +++ b/nuget/MessagePack.nuspec @@ -2,7 +2,7 @@ MessagePack - 1.7.3.4 + 1.7.3.7 Codestin Search App neuecc neuecc @@ -48,4 +48,4 @@ - \ No newline at end of file + diff --git a/nuget/MessagePackAnalyzer.nuspec b/nuget/MessagePackAnalyzer.nuspec index b2038d6f1..a4036228b 100644 --- a/nuget/MessagePackAnalyzer.nuspec +++ b/nuget/MessagePackAnalyzer.nuspec @@ -2,7 +2,7 @@ MessagePackAnalyzer - 1.6.1 + 1.7.3.7 Codestin Search App neuecc neuecc @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/nuget/push.bat b/nuget/push.bat index f3f2d3f3a..43cbbdcfa 100644 --- a/nuget/push.bat +++ b/nuget/push.bat @@ -1,6 +1,6 @@ -nuget push MessagePack.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.ImmutableCollection.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.ReactiveProperty.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.UnityShims.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -nuget push MessagePack.AspNetCoreMvcFormatter.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package -REM nuget push MessagePackAnalyzer.1.7.3.4.nupkg -Source https://www.nuget.org/api/v2/package +nuget push MessagePack.1.7.3.7.nupkg -Source https://www.nuget.org/api/v2/package +nuget push MessagePack.ImmutableCollection.1.7.3.7.nupkg -Source https://www.nuget.org/api/v2/package +nuget push MessagePack.ReactiveProperty.1.7.3.7.nupkg -Source https://www.nuget.org/api/v2/package +nuget push MessagePack.UnityShims.1.7.3.7.nupkg -Source https://www.nuget.org/api/v2/package +nuget push MessagePack.AspNetCoreMvcFormatter.1.7.3.7.nupkg -Source https://www.nuget.org/api/v2/package +REM nuget push MessagePackAnalyzer.1.7.3.7.nupkg -Source https://www.nuget.org/api/v2/package diff --git a/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs b/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs index 9f727b568..d7e2da99d 100644 --- a/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs +++ b/src/MessagePack.AspNetCoreMvcFormatter/_AssemblyInfo.cs @@ -11,5 +11,5 @@ [assembly: ComVisible(false)] [assembly: Guid("7c1f59ed-3929-4cbb-8aca-b13139fbca3a")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] +[assembly: AssemblyVersion("1.7.3.7")] +[assembly: AssemblyFileVersion("1.7.3.7")] diff --git a/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs b/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs index 3c4c3199f..c4a614c4e 100644 --- a/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs +++ b/src/MessagePack.ImmutableCollection/_AssemblyInfo.cs @@ -11,5 +11,5 @@ [assembly: ComVisible(false)] [assembly: Guid("fe5a979e-24c6-47dd-919f-81df6fb2e160")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] +[assembly: AssemblyVersion("1.7.3.7")] +[assembly: AssemblyFileVersion("1.7.3.7")] diff --git a/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs b/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs index 38a2ba60c..d655c6f39 100644 --- a/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs +++ b/src/MessagePack.ReactiveProperty/_AssemblyInfo.cs @@ -11,5 +11,5 @@ [assembly: ComVisible(false)] [assembly: Guid("16b0640a-c86d-4f21-bf2f-45efc728ae96")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] +[assembly: AssemblyVersion("1.7.3.7")] +[assembly: AssemblyFileVersion("1.7.3.7")] diff --git a/src/MessagePack.UnityShims/_AssemblyInfo.cs b/src/MessagePack.UnityShims/_AssemblyInfo.cs index 1a5fa01e7..c12bb942c 100644 --- a/src/MessagePack.UnityShims/_AssemblyInfo.cs +++ b/src/MessagePack.UnityShims/_AssemblyInfo.cs @@ -11,5 +11,5 @@ [assembly: ComVisible(false)] [assembly: Guid("4b074f49-f7cb-4885-9a58-cc75a7d64b62")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] +[assembly: AssemblyVersion("1.7.3.7")] +[assembly: AssemblyFileVersion("1.7.3.7")] diff --git a/src/MessagePack/_AssemblyInfo.cs b/src/MessagePack/_AssemblyInfo.cs index 8fe3f55ad..e42b2d62a 100644 --- a/src/MessagePack/_AssemblyInfo.cs +++ b/src/MessagePack/_AssemblyInfo.cs @@ -12,8 +12,8 @@ [assembly: ComVisible(false)] [assembly: Guid("b23e464e-0ac2-47c9-9520-ea98cbb99575")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] +[assembly: AssemblyVersion("1.7.3.7")] +[assembly: AssemblyFileVersion("1.7.3.7")] // sn.exe -Tp //[assembly: InternalsVisibleTo("MessagePack.Tests, PublicKey=" + @@ -21,4 +21,4 @@ //"53afbea4e949ef54c2a388b08b5ebd143c811da82f22aa20c839ed1c0b4da83e7195e8c1dbe1bf" + //"3934e4e8fd7fb93f893439106fbf055a97c7fac0f7f8c39e58e78371dc0e3825e5b9d7e2afff03" + //"72f03c4d67ff7df0dbfb58dcadeb1044840de152bf8270de7fc54255ace8efd026c16311760d1a" + -//"2570c3e8")] \ No newline at end of file +//"2570c3e8")] From dfee22b140c6280a2bf7536ce838a46e45481521 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 16 Apr 2019 23:27:51 -0700 Subject: [PATCH 077/105] Build *_validate branches --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fa4f580ce..b6567ab40 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,6 +1,6 @@ trigger: branches: - include: ["master", "v1.8"] + include: ["master", "v1.8", "*_validate"] paths: exclude: ["doc", "*.md"] From acef8f66fbf5ad60dc8695dd8f342ea9cbba687b Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 22 Apr 2019 14:41:35 -0700 Subject: [PATCH 078/105] Remove references to Microbuild These never applied to this repo -- it came over as a copy-and-paste error from a Microsoft repo. --- azure-pipelines/build.yml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 088fa5c3b..0b55f292b 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -36,9 +36,6 @@ steps: Write-Host "Running under OSS account: $env:System_TeamFoundationCollectionUri" } -- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}: - - template: azure-pipeline.microbuild.before.yml - - task: DotNetCoreCLI@2 displayName: Restore inputs: @@ -48,7 +45,7 @@ steps: feedsToUse: config nugetConfigPath: nuget.config -# Use VSBuild to pack because `dotnet pack` can't sign packages with MicroBuild. +# Use VSBuild to pack because `dotnet pack` can't build VSIX projects. - task: VSBuild@1 inputs: vsVersion: 15.0 @@ -101,16 +98,6 @@ steps: ## The rest of these steps are for deployment and skipped for PR builds -#- task: PublishBuildArtifacts@1 -# inputs: -# PathtoPublish: $(build.sourcesdirectory)/bin -# ArtifactName: bin -# ArtifactType: Container -# condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) - -- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}: - - template: azure-pipeline.microbuild.after.yml - - task: CopyFiles@1 inputs: Contents: | From 20d92013a35f0c0a01fff0b64bfee3e76e173856 Mon Sep 17 00:00:00 2001 From: Ali Akbar Mohammadi Date: Sun, 2 Jun 2019 19:55:46 +0800 Subject: [PATCH 079/105] Fix a bug in ToLZ4BinaryCore --- src/MessagePack/LZ4/LZ4MessagePackSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs b/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs index 41362de6c..e5499c244 100644 --- a/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs +++ b/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs @@ -109,7 +109,7 @@ static ArraySegment ToLZ4BinaryCore(ArraySegment serializedData) var offset = 0; var buffer = LZ4MemoryPool.GetBuffer(); var maxOutCount = LZ4Codec.MaximumOutputLength(serializedData.Count); - if (buffer.Length + 6 + 5 < maxOutCount) // (ext header size + fixed length size) + if (buffer.Length + 6 + 5 > maxOutCount) // (ext header size + fixed length size) { buffer = new byte[6 + 5 + maxOutCount]; } From 75a9c7c7ff813362b8e73f04a01468c5dcd17529 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sun, 2 Jun 2019 20:39:30 -0600 Subject: [PATCH 080/105] Update to 2.2.300 of the SDK This has better dotnet test functionality. --- azure-pipelines/build.yml | 6 +++--- global.json | 4 ++-- tests/MessagePack.Tests/MessagePack.Tests.csproj | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 0b55f292b..4f9c5df78 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -1,9 +1,9 @@ steps: -- task: DotNetCoreInstaller@0 - displayName: Install .NET Core SDK 2.2.104 +- task: UseDotNet@2 + displayName: Install .NET Core SDK 2.2.300 inputs: packageType: sdk - version: 2.2.104 + version: 2.2.300 - script: dotnet --info displayName: Show dotnet SDK info diff --git a/global.json b/global.json index ff860dc32..3ccbb8c4e 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - // Get the pinned version of the SDK from https://dotnet.microsoft.com/download/dotnet-core/2.1 - "version": "2.2.104" + // Get the pinned version of the SDK from https://dotnet.microsoft.com/download/dotnet-core/2.2 + "version": "2.2.300" } } diff --git a/tests/MessagePack.Tests/MessagePack.Tests.csproj b/tests/MessagePack.Tests/MessagePack.Tests.csproj index 08400d89f..cd0509d34 100644 --- a/tests/MessagePack.Tests/MessagePack.Tests.csproj +++ b/tests/MessagePack.Tests/MessagePack.Tests.csproj @@ -2,7 +2,6 @@ net461;net47;netcoreapp1.0;netcoreapp2.0 true - true true true $(NoWarn);CS1701 From def991eb5bc727ddec85cc51d8b473d169bcf86e Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sun, 2 Jun 2019 20:48:18 -0600 Subject: [PATCH 081/105] Upgrade to VS 2019 on build agents --- azure-pipelines.yml | 3 ++- azure-pipelines/build.yml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b6567ab40..a9b4933d6 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,6 +12,7 @@ variables: jobs: - job: Windows - pool: Hosted VS2017 + pool: + vmImage: windows-2019 steps: - template: azure-pipelines/build.yml diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 4f9c5df78..dc988a094 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -48,7 +48,7 @@ steps: # Use VSBuild to pack because `dotnet pack` can't build VSIX projects. - task: VSBuild@1 inputs: - vsVersion: 15.0 + vsVersion: 16.0 solution: MessagePack.sln msbuildArgs: /t:build,pack /m /v:m /bl:"$(Build.ArtifactStagingDirectory)/build_logs/msbuild.binlog" platform: $(BuildPlatform) @@ -64,7 +64,7 @@ steps: - task: VSBuild@1 inputs: - vsVersion: 15.0 + vsVersion: 16.0 solution: src\MessagePack.UnityClient\MessagePack.UnityClient.sln msbuildArgs: /t:build /m /v:m /bl:"$(Build.ArtifactStagingDirectory)/build_logs/msbuild.unity.binlog" platform: $(BuildPlatform) From 21dfc0d6ae3458372ab3b6c7088e33d5bec99871 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sun, 2 Jun 2019 21:07:44 -0600 Subject: [PATCH 082/105] Install missing runtimes Now that we're using UseDotNet, we have to specify every runtime/SDK we use since all that are included on the agent are hidden once we invoke this task. That's actually a Good Thing though, since it means we document more of our dependencies on the build agent. --- azure-pipelines/build.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index dc988a094..383e94558 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -4,6 +4,21 @@ steps: inputs: packageType: sdk version: 2.2.300 +- task: UseDotNet@2 + displayName: Install .NET Core runtime 1.0.x + inputs: + packageType: runtime + version: 1.0.x +- task: UseDotNet@2 + displayName: Install .NET Core runtime 2.0.x + inputs: + packageType: runtime + version: 2.0.x +- task: UseDotNet@2 + displayName: Install .NET Core runtime 2.1.x + inputs: + packageType: runtime + version: 2.1.x - script: dotnet --info displayName: Show dotnet SDK info From eb9bfd9e483cd58ea47855517b85db89527cf627 Mon Sep 17 00:00:00 2001 From: Ali Akbar Mohammadi Date: Mon, 3 Jun 2019 12:58:14 +0800 Subject: [PATCH 083/105] Fixed a bug in LZ4 serializer Add unit test to show error before fix and after the fix --- src/MessagePack/LZ4/LZ4MessagePackSerializer.cs | 2 +- tests/MessagePack.Tests/ExtensionTests/LZ4Test.cs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs b/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs index e5499c244..7249c2622 100644 --- a/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs +++ b/src/MessagePack/LZ4/LZ4MessagePackSerializer.cs @@ -109,7 +109,7 @@ static ArraySegment ToLZ4BinaryCore(ArraySegment serializedData) var offset = 0; var buffer = LZ4MemoryPool.GetBuffer(); var maxOutCount = LZ4Codec.MaximumOutputLength(serializedData.Count); - if (buffer.Length + 6 + 5 > maxOutCount) // (ext header size + fixed length size) + if (buffer.Length < 6 + 5 + maxOutCount) // (ext header size + fixed length size) { buffer = new byte[6 + 5 + maxOutCount]; } diff --git a/tests/MessagePack.Tests/ExtensionTests/LZ4Test.cs b/tests/MessagePack.Tests/ExtensionTests/LZ4Test.cs index ca304055f..09aa72624 100644 --- a/tests/MessagePack.Tests/ExtensionTests/LZ4Test.cs +++ b/tests/MessagePack.Tests/ExtensionTests/LZ4Test.cs @@ -146,5 +146,19 @@ public void Decode() MessagePackSerializer.Deserialize(msgpack1).Is(100); MessagePackSerializer.Deserialize(msgpack2).IsStructuralEqual(originalData); } + + [Fact] + public void BigList() + { + int capacity = 21974; + List list = new List(capacity); + for (long i = 0; i < capacity; i++) + list.Add(i); + var data = LZ4MessagePackSerializer.Serialize(list); + data.Length.IsNot(11); + + var testList = LZ4MessagePackSerializer.Deserialize>(data); + testList.Count.Is(list.Count); + } } } From 0e92591debe9cbdcf8b48837e962904005f21485 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 3 Jun 2019 07:49:35 -0600 Subject: [PATCH 084/105] Build 1.8-beta releases instead of -alpha --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index c1ecc3c44..e313cd73d 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "1.8-alpha", + "version": "1.8-beta", "assemblyVersion": { "precision": "revision" }, From f45fafc5013cc452c24be9ccdd122e05db0a1381 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 8 Jul 2019 22:10:23 -0600 Subject: [PATCH 085/105] Remove need for locally installed targeting packs in order to build --- Directory.Build.props | 1 + 1 file changed, 1 insertion(+) diff --git a/Directory.Build.props b/Directory.Build.props index bff70e3f6..ca348e9a7 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -26,5 +26,6 @@ + From c2730a793a0afcd3672fee931b93401b2fda39bf Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 8 Jul 2019 22:14:18 -0600 Subject: [PATCH 086/105] Update package references --- Directory.Build.props | 4 ++-- src/MessagePack/MessagePack.csproj | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index ca348e9a7..422a08e0b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -24,8 +24,8 @@ - - + + diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index cd48adf2d..f8a539cb6 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -36,7 +36,7 @@ - + From 4a7e76d3a153e9b282d870643a8eb514077b99ff Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 24 Jul 2019 12:35:36 -0600 Subject: [PATCH 087/105] Remove unnecessary nuget feeds --- nuget.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/nuget.config b/nuget.config index 5a758dc71..e29651519 100644 --- a/nuget.config +++ b/nuget.config @@ -6,7 +6,5 @@ - - From de7ec6c8b4200eefe04c62fd2c958a17fdaf6d3c Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 10 Oct 2019 16:58:58 -0600 Subject: [PATCH 088/105] Set version to '1.8' --- version.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/version.json b/version.json index e313cd73d..4265b6834 100644 --- a/version.json +++ b/version.json @@ -1,11 +1,11 @@ { "$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "1.8-beta", + "version": "1.8", "assemblyVersion": { - "precision": "revision" + "precision": "revision" }, "publicReleaseRefSpec": [ - "^refs/heads/master$", // we release out of master - "^refs/heads/v\\d+(?:.\\d+)?$" // we also release out of vNN branches + "^refs/heads/master$", + "^refs/heads/v\\d+(?:.\\d+)?$" ] -} +} \ No newline at end of file From 10c860935c7bc2a9b38e01a25a566e4dd10281bb Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 30 Oct 2019 17:07:23 -0600 Subject: [PATCH 089/105] Stop building assembly version with revision precision This came from the master branch, which is unstable so revision-level precision is useful. But in a stable v1.8 branch we really want major.minor precision only. Doing so now makes the assembly version go *backwards* from 1.8.74.32478 (the last released package) to 1.8.0.0. This is odd, but at this point we only have a small handful of downloads of the 1.8.74 package, so best to fix it now. --- version.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/version.json b/version.json index 4265b6834..680c50ca1 100644 --- a/version.json +++ b/version.json @@ -1,9 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", "version": "1.8", - "assemblyVersion": { - "precision": "revision" - }, "publicReleaseRefSpec": [ "^refs/heads/master$", "^refs/heads/v\\d+(?:.\\d+)?$" From cb1806aa8a7bba8951cfdd468a9dd811926ee08d Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 2 Nov 2019 09:51:28 -0600 Subject: [PATCH 090/105] Update System.Threading.Tasks.Extensions dependency to 4.5.3 Fixes #544 --- src/MessagePack/MessagePack.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index f8a539cb6..e936a4dc8 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -36,7 +36,7 @@ - + From fcaeeba4e2458e81cd75563226e5d61afc8a593a Mon Sep 17 00:00:00 2001 From: neuecc Date: Tue, 5 Nov 2019 17:49:08 +0900 Subject: [PATCH 091/105] add packageexporter to 1.8, #593 --- .../Assets/Scripts/Editor/PackageExporter.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/MessagePack.UnityClient/Assets/Scripts/Editor/PackageExporter.cs diff --git a/src/MessagePack.UnityClient/Assets/Scripts/Editor/PackageExporter.cs b/src/MessagePack.UnityClient/Assets/Scripts/Editor/PackageExporter.cs new file mode 100644 index 000000000..30bdb65fe --- /dev/null +++ b/src/MessagePack.UnityClient/Assets/Scripts/Editor/PackageExporter.cs @@ -0,0 +1,31 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +public static class PackageExporter +{ + [MenuItem("Tools/Export Unitypackage")] + public static void Export() + { + // configure + var root = "Scripts/MessagePack"; + var exportPath = "./MessagePack.Unity.unitypackage"; // missing version:) + + var path = Path.Combine(Application.dataPath, root); + var assets = Directory.GetFiles(path, "*", SearchOption.AllDirectories) + .Where(x => Path.GetExtension(x) == ".cs" || Path.GetExtension(x) == ".asmdef" || Path.GetExtension(x) == ".json" || Path.GetExtension(x) == ".meta") + .Select(x => "Assets" + x.Replace(Application.dataPath, "").Replace(@"\", "/")) + .ToArray(); + + UnityEngine.Debug.Log("Export below files" + Environment.NewLine + string.Join(Environment.NewLine, assets)); + + AssetDatabase.ExportPackage( + assets, + exportPath, + ExportPackageOptions.Default); + + UnityEngine.Debug.Log("Export complete: " + Path.GetFullPath(exportPath)); + } +} \ No newline at end of file From 2f1a4bcc187499ae4ca5a3124f1a736e84f234f8 Mon Sep 17 00:00:00 2001 From: neuecc Date: Tue, 5 Nov 2019 17:51:06 +0900 Subject: [PATCH 092/105] don't use expression body for unity --- src/MessagePack/MessagePackBinary.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/MessagePack/MessagePackBinary.cs b/src/MessagePack/MessagePackBinary.cs index 5e5813be3..813842716 100644 --- a/src/MessagePack/MessagePackBinary.cs +++ b/src/MessagePack/MessagePackBinary.cs @@ -2347,7 +2347,10 @@ public static DateTime ReadDateTime(byte[] bytes, int offset, out int readSize) /// Throws an exception indicating that there aren't enough bytes remaining in the buffer to store /// the promised data. /// - internal static void ThrowNotEnoughBytesException() => throw new EndOfStreamException(); + internal static void ThrowNotEnoughBytesException() + { + throw new EndOfStreamException(); + } } // Stream Overload From a63be88b4cf760d834dd9ee5c71a76d745ac8e04 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 7 Nov 2019 17:08:23 -0700 Subject: [PATCH 093/105] Build .snupkg archives for nuget.org publishing This allows the VS debugger to automatically find the pdb files and allow stepping into MessagePack code from a consuming application. --- Directory.Build.props | 3 ++- azure-pipelines/build.yml | 1 + src/MessagePackAnalyzer/MessagePackAnalyzer.csproj | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 422a08e0b..deed89680 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -18,7 +18,8 @@ true true - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true + snupkg diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 383e94558..8e2ebd0a9 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -117,6 +117,7 @@ steps: inputs: Contents: | bin/**/$(BuildConfiguration)/**/*.nupkg + bin/**/$(BuildConfiguration)/**/*.snupkg bin/**/$(BuildConfiguration)/**/*.vsix TargetFolder: $(Build.ArtifactStagingDirectory)/deployables flattenFolders: true diff --git a/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj b/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj index c23cab33a..3030be1d4 100644 --- a/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj +++ b/src/MessagePackAnalyzer/MessagePackAnalyzer.csproj @@ -7,6 +7,7 @@ MsgPack;MessagePack;Serialization;Formatter;Analyzer false $(TargetsForTfmSpecificContentInPackage);PackBuildOutputs + false From 185347fcac102441957b468e455054bb66b54800 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 11 Jan 2020 20:57:07 -0700 Subject: [PATCH 094/105] Update .tt files to match .cs files --- src/MessagePack/Formatters/TupleFormatter.tt | 2 +- src/MessagePack/Formatters/ValueTupleFormatter.tt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MessagePack/Formatters/TupleFormatter.tt b/src/MessagePack/Formatters/TupleFormatter.tt index eac393d47..757ff9c6c 100644 --- a/src/MessagePack/Formatters/TupleFormatter.tt +++ b/src/MessagePack/Formatters/TupleFormatter.tt @@ -4,7 +4,7 @@ <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ output extension=".cs" #> -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; diff --git a/src/MessagePack/Formatters/ValueTupleFormatter.tt b/src/MessagePack/Formatters/ValueTupleFormatter.tt index bc94a47f7..8920d0675 100644 --- a/src/MessagePack/Formatters/ValueTupleFormatter.tt +++ b/src/MessagePack/Formatters/ValueTupleFormatter.tt @@ -4,7 +4,7 @@ <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ output extension=".cs" #> -#if NETSTANDARD +#if NETSTANDARD || NETFRAMEWORK using System; namespace MessagePack.Formatters From caf846f83d5dc668e1374661224dd776a55add1b Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sun, 12 Jan 2020 13:25:19 -0700 Subject: [PATCH 095/105] Fix DynamicCodeDumper to build an exe --- sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj b/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj index e36ad5ee6..fe5878a07 100644 --- a/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj +++ b/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj @@ -1,5 +1,6 @@  + Exe net461 true From 74062a19d5d69998b722210b3d39fafb7423453d Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 11 Jan 2020 18:39:42 -0700 Subject: [PATCH 096/105] Mitigate risk of hash collision attacks --- .../Formatters.cs | 8 +- src/MessagePack/BitOperations.cs | 36 ++ .../Formatters/CollectionFormatter.cs | 8 +- .../Formatters/CollectionHelpers`2.cs | 53 ++ .../Formatters/DictionaryFormatter.cs | 12 +- .../Formatters/PrimitiveObjectFormatter.cs | 3 +- src/MessagePack/HashCode.cs | 481 ++++++++++++++++++ src/MessagePack/MessagePackSecurity.cs | 351 +++++++++++++ tests/MessagePack.Tests/AssemblyInfo.cs | 5 + .../MessagePackSecurityTests.cs | 193 +++++++ version.json | 2 +- 11 files changed, 1136 insertions(+), 16 deletions(-) create mode 100644 src/MessagePack/BitOperations.cs create mode 100644 src/MessagePack/Formatters/CollectionHelpers`2.cs create mode 100644 src/MessagePack/HashCode.cs create mode 100644 src/MessagePack/MessagePackSecurity.cs create mode 100644 tests/MessagePack.Tests/AssemblyInfo.cs create mode 100644 tests/MessagePack.Tests/MessagePackSecurityTests.cs diff --git a/src/MessagePack.ImmutableCollection/Formatters.cs b/src/MessagePack.ImmutableCollection/Formatters.cs index 256c75aaa..4be2b2de2 100644 --- a/src/MessagePack.ImmutableCollection/Formatters.cs +++ b/src/MessagePack.ImmutableCollection/Formatters.cs @@ -94,7 +94,7 @@ protected override ImmutableDictionary Complete(ImmutableDictionar protected override ImmutableDictionary.Builder Create(int count) { - return ImmutableDictionary.CreateBuilder(); + return ImmutableDictionary.CreateBuilder(MessagePackSecurity.Active.GetEqualityComparer()); } protected override ImmutableDictionary.Enumerator GetSourceEnumerator(ImmutableDictionary source) @@ -117,7 +117,7 @@ protected override ImmutableHashSet Complete(ImmutableHashSet.Builder inte protected override ImmutableHashSet.Builder Create(int count) { - return ImmutableHashSet.CreateBuilder(); + return ImmutableHashSet.CreateBuilder(MessagePackSecurity.Active.GetEqualityComparer()); } protected override ImmutableHashSet.Enumerator GetSourceEnumerator(ImmutableHashSet source) @@ -242,7 +242,7 @@ protected override IImmutableDictionary Complete(ImmutableDictiona protected override ImmutableDictionary.Builder Create(int count) { - return ImmutableDictionary.CreateBuilder(); + return ImmutableDictionary.CreateBuilder(MessagePackSecurity.Active.GetEqualityComparer()); } } @@ -260,7 +260,7 @@ protected override IImmutableSet Complete(ImmutableHashSet.Builder interme protected override ImmutableHashSet.Builder Create(int count) { - return ImmutableHashSet.CreateBuilder(); + return ImmutableHashSet.CreateBuilder(MessagePackSecurity.Active.GetEqualityComparer()); } } diff --git a/src/MessagePack/BitOperations.cs b/src/MessagePack/BitOperations.cs new file mode 100644 index 000000000..c8462930a --- /dev/null +++ b/src/MessagePack/BitOperations.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +// + +#if !NETCOREAPP + +using System.Runtime.CompilerServices; + +// Some routines inspired by the Stanford Bit Twiddling Hacks by Sean Eron Anderson: +// http://graphics.stanford.edu/~seander/bithacks.html + +namespace System.Numerics +{ + /// + /// Utility methods for intrinsic bit-twiddling operations. + /// The methods use hardware intrinsics when available on the underlying platform, + /// otherwise they use optimized software fallbacks. + /// + internal static class BitOperations + { + /// + /// Rotates the specified value left by the specified number of bits. + /// Similar in behavior to the x86 instruction ROL. + /// + /// The value to rotate. + /// The number of bits to rotate by. + /// Any value outside the range [0..31] is treated as congruent mod 32. + /// The rotated value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint RotateLeft(uint value, int offset) + => (value << offset) | (value >> (32 - offset)); + } +} + +#endif diff --git a/src/MessagePack/Formatters/CollectionFormatter.cs b/src/MessagePack/Formatters/CollectionFormatter.cs index de17ec59e..495f1c52d 100644 --- a/src/MessagePack/Formatters/CollectionFormatter.cs +++ b/src/MessagePack/Formatters/CollectionFormatter.cs @@ -487,7 +487,7 @@ protected override HashSet Complete(HashSet intermediateCollection) protected override HashSet Create(int count) { - return new HashSet(); + return new HashSet(MessagePackSecurity.Active.GetEqualityComparer()); } protected override HashSet.Enumerator GetSourceEnumerator(HashSet source) @@ -847,7 +847,7 @@ public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResol var count = MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - var dict = new T(); + var dict = CollectionHelpers.CreateHashCollection(count, MessagePackSecurity.Active.GetEqualityComparer()); for (int i = 0; i < count; i++) { var key = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); @@ -906,7 +906,7 @@ public IDictionary Deserialize(byte[] bytes, int offset, IFormatterResolver form var count = MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - var dict = new Dictionary(count); + var dict = new Dictionary(count, MessagePackSecurity.Active.GetEqualityComparer()); for (int i = 0; i < count; i++) { var key = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); @@ -1004,7 +1004,7 @@ protected override ISet Complete(HashSet intermediateCollection) protected override HashSet Create(int count) { - return new HashSet(); + return new HashSet(MessagePackSecurity.Active.GetEqualityComparer()); } } diff --git a/src/MessagePack/Formatters/CollectionHelpers`2.cs b/src/MessagePack/Formatters/CollectionHelpers`2.cs new file mode 100644 index 000000000..6c07a0ec0 --- /dev/null +++ b/src/MessagePack/Formatters/CollectionHelpers`2.cs @@ -0,0 +1,53 @@ +// Copyright (c) All contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace MessagePack.Formatters +{ + /// + /// Provides general helpers for creating collections (including dictionaries). + /// + /// The concrete type of collection to create. + /// The type of equality comparer that we would hope to pass into the collection's constructor. + internal static class CollectionHelpers + where TCollection : new() + { + /// + /// The delegate that will create the collection, if the typical (int count, IEqualityComparer{T} equalityComparer) constructor was found. + /// + private static Func collectionCreator; + + /// + /// Initializes static members of the class. + /// + /// + /// Initializes a delegate that is optimized to create a collection of a given size and using the given equality comparer, if possible. + /// + static CollectionHelpers() + { + var ctor = typeof(TCollection).GetTypeInfo().GetConstructor(new Type[] { typeof(int), typeof(TEqualityComparer) }); + if (ctor != null) + { + ParameterExpression param1 = Expression.Parameter(typeof(int), "count"); + ParameterExpression param2 = Expression.Parameter(typeof(TEqualityComparer), "equalityComparer"); + NewExpression body = Expression.New(ctor, param1, param2); + collectionCreator = Expression.Lambda>(body, param1, param2).Compile(); + } + } + + /// + /// Initializes a new instance of the collection. + /// + /// The number of elements the collection should be prepared to receive. + /// The equality comparer to initialize the collection with. + /// The newly initialized collection. + /// + /// Use of the and are a best effort. + /// If we can't find a constructor on the collection in the expected shape, we'll just instantiate the collection with its default constructor. + /// + internal static TCollection CreateHashCollection(int count, TEqualityComparer equalityComparer) => collectionCreator != null ? collectionCreator.Invoke(count, equalityComparer) : new TCollection(); + } +} diff --git a/src/MessagePack/Formatters/DictionaryFormatter.cs b/src/MessagePack/Formatters/DictionaryFormatter.cs index ea7a3a6e7..08a88981b 100644 --- a/src/MessagePack/Formatters/DictionaryFormatter.cs +++ b/src/MessagePack/Formatters/DictionaryFormatter.cs @@ -147,7 +147,7 @@ protected override Dictionary Complete(Dictionary in protected override Dictionary Create(int count) { - return new Dictionary(count); + return new Dictionary(count, MessagePackSecurity.Active.GetEqualityComparer()); } protected override Dictionary.Enumerator GetSourceEnumerator(Dictionary source) @@ -166,7 +166,7 @@ protected override void Add(TDictionary collection, int index, TKey key, TValue protected override TDictionary Create(int count) { - return new TDictionary(); + return CollectionHelpers>.CreateHashCollection(count, MessagePackSecurity.Active.GetEqualityComparer()); } } @@ -179,7 +179,7 @@ protected override void Add(Dictionary collection, int index, TKey protected override Dictionary Create(int count) { - return new Dictionary(count); + return new Dictionary(count, MessagePackSecurity.Active.GetEqualityComparer()); } protected override IDictionary Complete(Dictionary intermediateCollection) @@ -238,7 +238,7 @@ protected override ReadOnlyDictionary Complete(Dictionary Create(int count) { - return new Dictionary(count); + return new Dictionary(count, MessagePackSecurity.Active.GetEqualityComparer()); } } @@ -256,7 +256,7 @@ protected override IReadOnlyDictionary Complete(Dictionary Create(int count) { - return new Dictionary(count); + return new Dictionary(count, MessagePackSecurity.Active.GetEqualityComparer()); } } @@ -270,7 +270,7 @@ protected override void Add(ConcurrentDictionary collection, int i protected override ConcurrentDictionary Create(int count) { // concurrent dictionary can't access defaultConcurrecyLevel so does not use count overload. - return new ConcurrentDictionary(); + return new ConcurrentDictionary(MessagePackSecurity.Active.GetEqualityComparer()); } } diff --git a/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs b/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs index dfeb15090..a9c29469b 100644 --- a/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs +++ b/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs @@ -10,6 +10,7 @@ public sealed class PrimitiveObjectFormatter : IMessagePackFormatter static readonly Dictionary typeToJumpCode = new Dictionary() { + // When adding types whose size exceeds 32-bits, add support in MessagePackSecurity.GetHashCollisionResistantEqualityComparer() { typeof(Boolean), 0 }, { typeof(Char), 1 }, { typeof(SByte), 2 }, @@ -220,7 +221,7 @@ public object Deserialize(byte[] bytes, int offset, IFormatterResolver formatter offset += readSize; var objectFormatter = formatterResolver.GetFormatter(); - var hash = new Dictionary(length); + var hash = new Dictionary(length, MessagePackSecurity.Active.GetEqualityComparer()); for (int i = 0; i < length; i++) { var key = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); diff --git a/src/MessagePack/HashCode.cs b/src/MessagePack/HashCode.cs new file mode 100644 index 000000000..8d48c08fd --- /dev/null +++ b/src/MessagePack/HashCode.cs @@ -0,0 +1,481 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +// + +/* + +The xxHash32 implementation is based on the code published by Yann Collet: +https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b39696afea1/xxhash.c + + xxHash - Fast Hash algorithm + Copyright (C) 2012-2016, Yann Collet + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - xxHash homepage: http://www.xxhash.com + - xxHash source repository : https://github.com/Cyan4973/xxHash + +*/ + +#if !NETCOREAPP + +using System.Collections.Generic; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Security.Cryptography; + +namespace System +{ + // xxHash32 is used for the hash code. + // https://github.com/Cyan4973/xxHash + + internal struct HashCode + { + private static readonly uint s_seed = GenerateGlobalSeed(); + + private const uint Prime1 = 2654435761U; + private const uint Prime2 = 2246822519U; + private const uint Prime3 = 3266489917U; + private const uint Prime4 = 668265263U; + private const uint Prime5 = 374761393U; + + private uint _v1, _v2, _v3, _v4; + private uint _queue1, _queue2, _queue3; + private uint _length; + + private static uint GenerateGlobalSeed() + { + var bytes = new byte[4]; + using (var rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(bytes); + } + + return BitConverter.ToUInt32(bytes, 0); + } + + public static int Combine(T1 value1) + { + unchecked + { + // Provide a way of diffusing bits from something with a limited + // input hash space. For example, many enums only have a few + // possible hashes, only using the bottom few bits of the code. Some + // collections are built on the assumption that hashes are spread + // over a larger space, so diffusing the bits may help the + // collection work more efficiently. + + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 4; + + hash = QueueRound(hash, hc1); + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 8; + + hash = QueueRound(hash, hc1); + hash = QueueRound(hash, hc2); + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2, T3 value3) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + uint hc3 = (uint)(value3?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 12; + + hash = QueueRound(hash, hc1); + hash = QueueRound(hash, hc2); + hash = QueueRound(hash, hc3); + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + uint hc3 = (uint)(value3?.GetHashCode() ?? 0); + uint hc4 = (uint)(value4?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 16; + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + uint hc3 = (uint)(value3?.GetHashCode() ?? 0); + uint hc4 = (uint)(value4?.GetHashCode() ?? 0); + uint hc5 = (uint)(value5?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 20; + + hash = QueueRound(hash, hc5); + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + uint hc3 = (uint)(value3?.GetHashCode() ?? 0); + uint hc4 = (uint)(value4?.GetHashCode() ?? 0); + uint hc5 = (uint)(value5?.GetHashCode() ?? 0); + uint hc6 = (uint)(value6?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 24; + + hash = QueueRound(hash, hc5); + hash = QueueRound(hash, hc6); + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + uint hc3 = (uint)(value3?.GetHashCode() ?? 0); + uint hc4 = (uint)(value4?.GetHashCode() ?? 0); + uint hc5 = (uint)(value5?.GetHashCode() ?? 0); + uint hc6 = (uint)(value6?.GetHashCode() ?? 0); + uint hc7 = (uint)(value7?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 28; + + hash = QueueRound(hash, hc5); + hash = QueueRound(hash, hc6); + hash = QueueRound(hash, hc7); + + hash = MixFinal(hash); + return (int)hash; + } + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) + { + unchecked + { + uint hc1 = (uint)(value1?.GetHashCode() ?? 0); + uint hc2 = (uint)(value2?.GetHashCode() ?? 0); + uint hc3 = (uint)(value3?.GetHashCode() ?? 0); + uint hc4 = (uint)(value4?.GetHashCode() ?? 0); + uint hc5 = (uint)(value5?.GetHashCode() ?? 0); + uint hc6 = (uint)(value6?.GetHashCode() ?? 0); + uint hc7 = (uint)(value7?.GetHashCode() ?? 0); + uint hc8 = (uint)(value8?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + v1 = Round(v1, hc5); + v2 = Round(v2, hc6); + v3 = Round(v3, hc7); + v4 = Round(v4, hc8); + + uint hash = MixState(v1, v2, v3, v4); + hash += 32; + + hash = MixFinal(hash); + return (int)hash; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void Initialize(out uint v1, out uint v2, out uint v3, out uint v4) + { + unchecked + { + v1 = s_seed + Prime1 + Prime2; + v2 = s_seed + Prime2; + v3 = s_seed; + v4 = s_seed - Prime1; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint Round(uint hash, uint input) + { + unchecked + { + return BitOperations.RotateLeft(hash + input * Prime2, 13) * Prime1; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint QueueRound(uint hash, uint queuedValue) + { + unchecked + { + return BitOperations.RotateLeft(hash + queuedValue * Prime3, 17) * Prime4; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint MixState(uint v1, uint v2, uint v3, uint v4) + { + unchecked + { + return BitOperations.RotateLeft(v1, 1) + BitOperations.RotateLeft(v2, 7) + BitOperations.RotateLeft(v3, 12) + BitOperations.RotateLeft(v4, 18); + } + } + + private static uint MixEmptyState() + { + unchecked + { + return s_seed + Prime5; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint MixFinal(uint hash) + { + unchecked + { + hash ^= hash >> 15; + hash *= Prime2; + hash ^= hash >> 13; + hash *= Prime3; + hash ^= hash >> 16; + return hash; + } + } + + public void Add(T value) + { + Add(value?.GetHashCode() ?? 0); + } + + public void Add(T value, IEqualityComparer comparer) + { + Add(comparer != null ? comparer.GetHashCode(value) : (value?.GetHashCode() ?? 0)); + } + + private void Add(int value) + { + unchecked + { + // The original xxHash works as follows: + // 0. Initialize immediately. We can't do this in a struct (no + // default ctor). + // 1. Accumulate blocks of length 16 (4 uints) into 4 accumulators. + // 2. Accumulate remaining blocks of length 4 (1 uint) into the + // hash. + // 3. Accumulate remaining blocks of length 1 into the hash. + + // There is no need for #3 as this type only accepts ints. _queue1, + // _queue2 and _queue3 are basically a buffer so that when + // ToHashCode is called we can execute #2 correctly. + + // We need to initialize the xxHash32 state (_v1 to _v4) lazily (see + // #0) nd the last place that can be done if you look at the + // original code is just before the first block of 16 bytes is mixed + // in. The xxHash32 state is never used for streams containing fewer + // than 16 bytes. + + // To see what's really going on here, have a look at the Combine + // methods. + + uint val = (uint)value; + + // Storing the value of _length locally shaves of quite a few bytes + // in the resulting machine code. + uint previousLength = _length++; + uint position = previousLength % 4; + + // Switch can't be inlined. + + if (position == 0) + _queue1 = val; + else if (position == 1) + _queue2 = val; + else if (position == 2) + _queue3 = val; + else // position == 3 + { + if (previousLength == 3) + Initialize(out _v1, out _v2, out _v3, out _v4); + + _v1 = Round(_v1, _queue1); + _v2 = Round(_v2, _queue2); + _v3 = Round(_v3, _queue3); + _v4 = Round(_v4, val); + } + } + } + + public int ToHashCode() + { + unchecked + { + // Storing the value of _length locally shaves of quite a few bytes + // in the resulting machine code. + uint length = _length; + + // position refers to the *next* queue position in this method, so + // position == 1 means that _queue1 is populated; _queue2 would have + // been populated on the next call to Add. + uint position = length % 4; + + // If the length is less than 4, _v1 to _v4 don't contain anything + // yet. xxHash32 treats this differently. + + uint hash = length < 4 ? MixEmptyState() : MixState(_v1, _v2, _v3, _v4); + + // _length is incremented once per Add(Int32) and is therefore 4 + // times too small (xxHash length is in bytes, not ints). + + hash += length * 4; + + // Mix what remains in the queue + + // Switch can't be inlined right now, so use as few branches as + // possible by manually excluding impossible scenarios (position > 1 + // is always false if position is not > 0). + if (position > 0) + { + hash = QueueRound(hash, _queue1); + if (position > 1) + { + hash = QueueRound(hash, _queue2); + if (position > 2) + hash = QueueRound(hash, _queue3); + } + } + + hash = MixFinal(hash); + return (int)hash; + } + } + +#pragma warning disable 0809 + // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. + // Disallowing GetHashCode and Equals is by design + + // * We decided to not override GetHashCode() to produce the hash code + // as this would be weird, both naming-wise as well as from a + // behavioral standpoint (GetHashCode() should return the object's + // hash code, not the one being computed). + + // * Even though ToHashCode() can be called safely multiple times on + // this implementation, it is not part of the contract. If the + // implementation has to change in the future we don't want to worry + // about people who might have incorrectly used this type. + + [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes. Use ToHashCode to retrieve the computed hash code.", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => throw new NotSupportedException(); + + [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes.", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => throw new NotSupportedException(); +#pragma warning restore 0809 + } +} + +#endif diff --git a/src/MessagePack/MessagePackSecurity.cs b/src/MessagePack/MessagePackSecurity.cs new file mode 100644 index 000000000..decfbc931 --- /dev/null +++ b/src/MessagePack/MessagePackSecurity.cs @@ -0,0 +1,351 @@ +// Copyright (c) All contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.ExceptionServices; +using MessagePack.Internal; + +namespace MessagePack +{ + /// + /// Settings related to security, particularly relevant when deserializing data from untrusted sources. + /// + public class MessagePackSecurity + { + /// + /// Gets an instance preconfigured with settings that omit all protections. Useful for deserializing fully-trusted and valid msgpack sequences. + /// + public static readonly MessagePackSecurity TrustedData = new MessagePackSecurity(); + + /// + /// Gets an instance preconfigured with protections applied with reasonable settings for deserializing untrusted msgpack sequences. + /// + public static readonly MessagePackSecurity UntrustedData = new MessagePackSecurity + { + HashCollisionResistant = true, + }; + + /// + /// The instance that is active for all deserialization operations within this AppDomain or process. + /// + /// Defaults to . + public static MessagePackSecurity Active = TrustedData; + + private readonly ObjectFallbackEqualityComparer objectFallbackEqualityComparer; + + private MessagePackSecurity() + { + this.objectFallbackEqualityComparer = new ObjectFallbackEqualityComparer(this); + } + + /// + /// Initializes a new instance of the class + /// with properties copied from a provided template. + /// + /// The template to copy from. + protected MessagePackSecurity(MessagePackSecurity copyFrom) + { + if (copyFrom is null) + { + throw new ArgumentNullException(nameof(copyFrom)); + } + + this.HashCollisionResistant = copyFrom.HashCollisionResistant; + } + + /// + /// Gets a value indicating whether data to be deserialized is untrusted and thus should not be allowed to create + /// dictionaries or other hash-based collections unless the hashed type has a hash collision resistant implementation available. + /// This can mitigate some denial of service attacks when deserializing untrusted code. + /// + /// + /// The value is false for and true for . + /// + public bool HashCollisionResistant { get; private set; } + + /// + /// Gets a copy of these options with the property set to a new value. + /// + /// The new value for the property. + /// The new instance; or the original if the value is unchanged. + public MessagePackSecurity WithHashCollisionResistant(bool hashCollisionResistant) + { + if (this.HashCollisionResistant == hashCollisionResistant) + { + return this; + } + + var clone = this.Clone(); + clone.HashCollisionResistant = hashCollisionResistant; + return clone; + } + + /// + /// Gets an that is suitable to use with a hash-based collection. + /// + /// The type of key that will be hashed in the collection. + /// The to use. + /// + /// When is active, this will be a collision resistant instance which may reject certain key types. + /// When is not active, this will be . + /// + public IEqualityComparer GetEqualityComparer() + { + return this.HashCollisionResistant ? GetHashCollisionResistantEqualityComparer() : EqualityComparer.Default; + } + + /// + /// Gets an that is suitable to use with a hash-based collection. + /// + /// The to use. + /// + /// When is active, this will be a collision resistant instance which may reject certain key types. + /// When is not active, this will be . + /// + public IEqualityComparer GetEqualityComparer() + { + return this.HashCollisionResistant ? GetHashCollisionResistantEqualityComparer() : EqualityComparer.Default; + } + + /// + /// Returns a hash collision resistant equality comparer. + /// + /// The type of key that will be hashed in the collection. + /// A hash collision resistant equality comparer. + protected virtual IEqualityComparer GetHashCollisionResistantEqualityComparer() + { + // For anything 32-bits and under, our fallback base secure hasher is usually adequate since it makes the hash unpredictable. + // We should have special implementations for any value that is larger than 32-bits in order to make sure + // that all the data gets hashed securely rather than trivially and predictably compressed into 32-bits before being hashed. + // We also have to specially handle some 32-bit types (e.g. float) where multiple in-memory representations should hash to the same value. + // Any type supported by the PrimitiveObjectFormatter should be added here if supporting it as a key in a collection makes sense. + return + // 32-bits or smaller: + typeof(T) == typeof(bool) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(char) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(sbyte) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(byte) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(short) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(ushort) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(int) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(uint) ? CollisionResistantHasher.Instance : + + // Larger than 32-bits (or otherwise require special handling): + typeof(T) == typeof(long) ? (IEqualityComparer)Int64EqualityComparer.Instance : + typeof(T) == typeof(ulong) ? (IEqualityComparer)UInt64EqualityComparer.Instance : + typeof(T) == typeof(float) ? (IEqualityComparer)SingleEqualityComparer.Instance : + typeof(T) == typeof(double) ? (IEqualityComparer)DoubleEqualityComparer.Instance : + typeof(T) == typeof(string) ? (IEqualityComparer)StringEqualityComparer.Instance : + typeof(T) == typeof(Guid) ? (IEqualityComparer)GuidEqualityComparer.Instance : + typeof(T) == typeof(DateTime) ? (IEqualityComparer)DateTimeEqualityComparer.Instance : + typeof(T) == typeof(DateTimeOffset) ? (IEqualityComparer)DateTimeOffsetEqualityComparer.Instance : + typeof(T) == typeof(object) ? (IEqualityComparer)this.objectFallbackEqualityComparer : + + // Any type we don't explicitly whitelist here shouldn't be allowed to use as the key in a hash-based collection since it isn't known to be hash resistant. + // This method can of course be overridden to add more hash collision resistant type support, or the deserializing party can indicate that the data is Trusted + // so that this method doesn't even get called. + throw new TypeAccessException($"No hash-resistant equality comparer available for type: {typeof(T)}"); + } + + /// + /// Returns a hash collision resistant equality comparer. + /// + /// A hash collision resistant equality comparer. + protected virtual IEqualityComparer GetHashCollisionResistantEqualityComparer() => (IEqualityComparer)this.GetHashCollisionResistantEqualityComparer(); + + /// + /// Creates a new instance that is a copy of this one. + /// + /// + /// Derived types should override this method to instantiate their own derived type. + /// + protected virtual MessagePackSecurity Clone() => new MessagePackSecurity(this); + + /// + /// A hash collision resistant implementation of . + /// + /// The type of key that will be hashed. + private class CollisionResistantHasher : IEqualityComparer, IEqualityComparer + { + internal static readonly CollisionResistantHasher Instance = new CollisionResistantHasher(); + + public bool Equals(T x, T y) => EqualityComparer.Default.Equals(x, y); + + bool IEqualityComparer.Equals(object x, object y) => ((IEqualityComparer)EqualityComparer.Default).Equals(x, y); + + public int GetHashCode(object obj) => this.GetHashCode((T)obj); + + public virtual int GetHashCode(T value) => HashCode.Combine(value); + } + + /// + /// A special hash-resistent equality comparer that defers picking the actual implementation + /// till it can check the runtime type of each value to be hashed. + /// + private class ObjectFallbackEqualityComparer : IEqualityComparer, IEqualityComparer + { + private static readonly object[] EmptyObjectArray = new object[0]; + private static readonly MethodInfo GetHashCollisionResistantEqualityComparerOpenGenericMethod = typeof(MessagePackSecurity).GetTypeInfo().DeclaredMethods.Single(m => m.Name == nameof(MessagePackSecurity.GetHashCollisionResistantEqualityComparer) && m.IsGenericMethod); + private readonly MessagePackSecurity security; + private readonly ThreadsafeTypeKeyHashTable equalityComparerCache = new ThreadsafeTypeKeyHashTable(); + + internal ObjectFallbackEqualityComparer(MessagePackSecurity security) + { + this.security = security ?? throw new ArgumentNullException(nameof(security)); + } + + bool IEqualityComparer.Equals(object x, object y) => EqualityComparer.Default.Equals(x, y); + + bool IEqualityComparer.Equals(object x, object y) => ((IEqualityComparer)EqualityComparer.Default).Equals(x, y); + + public int GetHashCode(object value) + { + if (value is null) + { + return 0; + } + + Type valueType = value.GetType(); + + // Take care to avoid recursion. + if (valueType == typeof(object)) + { + // We can trust object.GetHashCode() to be collision resistant. + return value.GetHashCode(); + } + + if (!equalityComparerCache.TryGetValue(valueType, out IEqualityComparer equalityComparer)) + { + try + { + equalityComparer = (IEqualityComparer)GetHashCollisionResistantEqualityComparerOpenGenericMethod.MakeGenericMethod(valueType).Invoke(this.security, EmptyObjectArray); + } + catch (TargetInvocationException ex) + { + ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); + } + + equalityComparerCache.TryAdd(valueType, equalityComparer); + } + + return equalityComparer.GetHashCode(value); + } + } + + private class UInt64EqualityComparer : CollisionResistantHasher + { + internal static new readonly UInt64EqualityComparer Instance = new UInt64EqualityComparer(); + + public override int GetHashCode(ulong value) => HashCode.Combine((uint)(value >> 32), unchecked((uint)value)); + } + + private class Int64EqualityComparer : CollisionResistantHasher + { + internal static new readonly Int64EqualityComparer Instance = new Int64EqualityComparer(); + + public override int GetHashCode(long value) => HashCode.Combine((int)(value >> 32), unchecked((int)value)); + } + + private class SingleEqualityComparer : CollisionResistantHasher + { + internal static new readonly SingleEqualityComparer Instance = new SingleEqualityComparer(); + + public override unsafe int GetHashCode(float value) + { + // Special check for 0.0 so that the hash of 0.0 and -0.0 will equal. + if (value == 0.0f) + { + return HashCode.Combine(0); + } + + // Standardize on the binary representation of NaN prior to hashing. + if (float.IsNaN(value)) + { + value = float.NaN; + } + + long l = *(long*)&value; + return HashCode.Combine((int)(l >> 32), unchecked((int)l)); + } + } + + private class DoubleEqualityComparer : CollisionResistantHasher + { + internal static new readonly DoubleEqualityComparer Instance = new DoubleEqualityComparer(); + + public override unsafe int GetHashCode(double value) + { + // Special check for 0.0 so that the hash of 0.0 and -0.0 will equal. + if (value == 0.0) + { + return HashCode.Combine(0); + } + + // Standardize on the binary representation of NaN prior to hashing. + if (double.IsNaN(value)) + { + value = double.NaN; + } + + long l = *(long*)&value; + return HashCode.Combine((int)(l >> 32), unchecked((int)l)); + } + } + + private class GuidEqualityComparer : CollisionResistantHasher + { + internal static new readonly GuidEqualityComparer Instance = new GuidEqualityComparer(); + + public override unsafe int GetHashCode(Guid value) + { + var hash = default(HashCode); + int* pGuid = (int*)&value; + for (int i = 0; i < sizeof(Guid) / sizeof(int); i++) + { + hash.Add(pGuid[i]); + } + + return hash.ToHashCode(); + } + } + + private class StringEqualityComparer : CollisionResistantHasher + { + internal static new readonly StringEqualityComparer Instance = new StringEqualityComparer(); + + public override int GetHashCode(string value) + { +#if NETCOREAPP + // .NET Core already has a secure string hashing function. Just use it. + return value?.GetHashCode() ?? 0; +#else + var hash = default(HashCode); + for (int i = 0; i < value.Length; i++) + { + hash.Add(value[i]); + } + + return hash.ToHashCode(); +#endif + } + } + + private class DateTimeEqualityComparer : CollisionResistantHasher + { + internal static new readonly DateTimeEqualityComparer Instance = new DateTimeEqualityComparer(); + + public override unsafe int GetHashCode(DateTime value) => HashCode.Combine((int)(value.Ticks >> 32), unchecked((int)value.Ticks), value.Kind); + } + + private class DateTimeOffsetEqualityComparer : CollisionResistantHasher + { + internal static new readonly DateTimeOffsetEqualityComparer Instance = new DateTimeOffsetEqualityComparer(); + + public override unsafe int GetHashCode(DateTimeOffset value) => HashCode.Combine((int)(value.UtcTicks >> 32), unchecked((int)value.UtcTicks)); + } + } +} diff --git a/tests/MessagePack.Tests/AssemblyInfo.cs b/tests/MessagePack.Tests/AssemblyInfo.cs new file mode 100644 index 000000000..4bb425f84 --- /dev/null +++ b/tests/MessagePack.Tests/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Runtime.InteropServices; +using Xunit; + +// Given MessagePack v1.x has mutable statics, we cannot afford to parallelize tests that might be mutating them +[assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/MessagePack.Tests/MessagePackSecurityTests.cs b/tests/MessagePack.Tests/MessagePackSecurityTests.cs new file mode 100644 index 000000000..37c04744f --- /dev/null +++ b/tests/MessagePack.Tests/MessagePackSecurityTests.cs @@ -0,0 +1,193 @@ +// Copyright (c) All contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using MessagePack; +using Xunit; +using Xunit.Abstractions; + +public class MessagePackSecurityTests +{ + public MessagePackSecurityTests(ITestOutputHelper logger) + { + Logger = logger; + } + + public ITestOutputHelper Logger { get; } + + [Fact] + public void Untrusted() + { + Assert.True(MessagePackSecurity.UntrustedData.HashCollisionResistant); + } + + [Fact] + public void Trusted() + { + Assert.False(MessagePackSecurity.TrustedData.HashCollisionResistant); + } + + [Fact] + public void WithHashCollisionResistant() + { + Assert.Same(MessagePackSecurity.TrustedData, MessagePackSecurity.TrustedData.WithHashCollisionResistant(false)); + Assert.True(MessagePackSecurity.TrustedData.WithHashCollisionResistant(true).HashCollisionResistant); + } + + [Fact] + public void EqualityComparer_CollisionResistance_Int64() + { + const long value1 = 0x100000001; + const long value2 = 0x200000002; + var eq = MessagePackSecurity.UntrustedData.GetEqualityComparer(); + Assert.Equal(EqualityComparer.Default.GetHashCode(value1), EqualityComparer.Default.GetHashCode(value2)); // demonstrate insecurity + Assert.NotEqual(eq.GetHashCode(value1), eq.GetHashCode(value2)); + } + + [Fact] + public void EqualityComparer_CollisionResistance_Guid() + { + Guid value1 = new Guid(new byte[] { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }); + Guid value2 = new Guid(new byte[] { 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 }); + var eq = MessagePackSecurity.UntrustedData.GetEqualityComparer(); +#if NETCOREAPP // We contrived the two GUIDs to force a collision on .NET Core. NETFx's algorithm is slightly different. + Assert.Equal(EqualityComparer.Default.GetHashCode(value1), EqualityComparer.Default.GetHashCode(value2)); // demonstrate insecurity +#endif + Assert.NotEqual(eq.GetHashCode(value1), eq.GetHashCode(value2)); + } + + [Fact] + public unsafe void EqualityComparer_Single() + { + var eq = MessagePackSecurity.UntrustedData.GetEqualityComparer(); + Assert.Equal(eq.GetHashCode(0.0f), eq.GetHashCode(-0.0f)); + + // Try multiple forms of NaN + float nan1, nan2; + *(uint*)&nan1 = 0xFFC00001; + *(uint*)&nan2 = 0xFF800001; + + Assert.True(float.IsNaN(nan1)); + Assert.True(float.IsNaN(nan2)); +#if NETCOREAPP // .NET Framework had a bug where these would not be equal + Assert.Equal(nan1.GetHashCode(), nan2.GetHashCode()); +#endif + Assert.Equal(eq.GetHashCode(nan1), eq.GetHashCode(nan2)); + Assert.Equal(eq.GetHashCode(float.NaN), eq.GetHashCode(-float.NaN)); + + // Try various other clearly different numbers + Assert.NotEqual(eq.GetHashCode(1.0f), eq.GetHashCode(-1.0f)); + Assert.NotEqual(eq.GetHashCode(1.0f), eq.GetHashCode(2.0f)); + } + + [Fact] + public unsafe void EqualityComparer_Double() + { + var eq = MessagePackSecurity.UntrustedData.GetEqualityComparer(); + Assert.Equal(eq.GetHashCode(0.0), eq.GetHashCode(-0.0)); + + // Try multiple forms of NaN + double nan1, nan2; + *(ulong*)&nan1 = 0xFFF8000000000001; + *(ulong*)&nan2 = 0xFFF8000000000002; + + Assert.True(double.IsNaN(nan1)); + Assert.True(double.IsNaN(nan2)); +#if NETCOREAPP // .NET Framework had a bug where these would not be equal + Assert.Equal(nan1.GetHashCode(), nan2.GetHashCode()); +#endif + Assert.Equal(eq.GetHashCode(nan1), eq.GetHashCode(nan2)); + Assert.Equal(eq.GetHashCode(double.NaN), eq.GetHashCode(-double.NaN)); + + // Try various other clearly different numbers + Assert.NotEqual(eq.GetHashCode(1.0), eq.GetHashCode(-1.0)); + Assert.NotEqual(eq.GetHashCode(1.0), eq.GetHashCode(2.0)); + } + + [Fact] + public void EqualityComparer_ObjectFallback() + { + var eq = MessagePackSecurity.UntrustedData.GetEqualityComparer(); + + Assert.Equal(eq.GetHashCode(null), eq.GetHashCode(null)); + Assert.NotEqual(eq.GetHashCode(null), eq.GetHashCode(new object())); + + Assert.Equal(eq.GetHashCode("hi"), eq.GetHashCode("hi")); + Assert.NotEqual(eq.GetHashCode("hi"), eq.GetHashCode("bye")); + + Assert.Equal(eq.GetHashCode(true), eq.GetHashCode(true)); + Assert.NotEqual(eq.GetHashCode(true), eq.GetHashCode(false)); + + var o = new object(); + Assert.Equal(eq.GetHashCode(o), eq.GetHashCode(o)); + Assert.NotEqual(eq.GetHashCode(o), eq.GetHashCode(new object())); + } + + /// + /// Verifies that arbitrary other types not known to be hash safe will be rejected. + /// + [Fact] + public void EqualityComparer_ObjectFallback_UnsupportedType() + { + var eq = MessagePackSecurity.UntrustedData.GetEqualityComparer(); + var ex = Assert.Throws(() => eq.GetHashCode(new AggregateException())); + this.Logger.WriteLine(ex.ToString()); + } + + [Fact] + public void TypelessFormatterWithUntrustedData_SafeKeys() + { + var data = new + { + A = (byte)3, + B = new Dictionary + { + { "C", 15 }, + }, + D = new string[] { "E", "F" }, + }; + byte[] msgpack = MessagePackSerializer.Serialize(data); + MessagePackSecurity.Active = MessagePackSecurity.UntrustedData; + try + { + var deserialized = (IDictionary)MessagePackSerializer.Deserialize(msgpack); + Assert.Equal(data.A, deserialized["A"]); + Assert.Equal(data.B["C"], ((Dictionary)deserialized["B"])["C"]); + Assert.Equal(data.D, deserialized["D"]); + } + finally + { + MessagePackSecurity.Active = MessagePackSecurity.TrustedData; + } + } + + [Fact] + public void TypelessFormatterWithUntrustedData_UnsafeKeys() + { + var data = new + { + B = new Dictionary + { + { new ArbitraryType(), 15 }, + }, + }; + byte[] msgpack = MessagePackSerializer.Serialize(data); + MessagePackSecurity.Active = MessagePackSecurity.UntrustedData; + try + { + var ex = Assert.Throws(() => MessagePackSerializer.Deserialize(msgpack)); + this.Logger.WriteLine(ex.ToString()); + } + finally + { + MessagePackSecurity.Active = MessagePackSecurity.TrustedData; + } + } + + [DataContract] + public class ArbitraryType + { + } +} diff --git a/version.json b/version.json index 680c50ca1..8cc8ee638 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "1.8", + "version": "1.9", "publicReleaseRefSpec": [ "^refs/heads/master$", "^refs/heads/v\\d+(?:.\\d+)?$" From 6f0ec181174ab96a1683d3394067079bddc86914 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 11 Jan 2020 20:39:00 -0700 Subject: [PATCH 097/105] Stop testing on .NET Core versions that are out of servicing --- azure-pipelines/build.yml | 10 ---------- tests/MessagePack.Tests/MessagePack.Tests.csproj | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 8e2ebd0a9..8e4ede467 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -4,16 +4,6 @@ steps: inputs: packageType: sdk version: 2.2.300 -- task: UseDotNet@2 - displayName: Install .NET Core runtime 1.0.x - inputs: - packageType: runtime - version: 1.0.x -- task: UseDotNet@2 - displayName: Install .NET Core runtime 2.0.x - inputs: - packageType: runtime - version: 2.0.x - task: UseDotNet@2 displayName: Install .NET Core runtime 2.1.x inputs: diff --git a/tests/MessagePack.Tests/MessagePack.Tests.csproj b/tests/MessagePack.Tests/MessagePack.Tests.csproj index cd0509d34..e46b81b27 100644 --- a/tests/MessagePack.Tests/MessagePack.Tests.csproj +++ b/tests/MessagePack.Tests/MessagePack.Tests.csproj @@ -1,6 +1,6 @@  - net461;net47;netcoreapp1.0;netcoreapp2.0 + net461;net47;netcoreapp2.1 true true true From 129239b10751dd3815610aaac09ca8420c15f881 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sun, 12 Jan 2020 17:18:41 -0700 Subject: [PATCH 098/105] Defend against stack overflow from deeply nested object graphs in msgpack --- README.md | 12 +- .../DynamicCodeDumper.csproj | 12 + sandbox/DynamicCodeDumper/Program.cs | 2 +- sandbox/Sandbox/Generated.cs | 3457 +++++++++-------- .../Formatters.cs | 10 +- .../Formatters.cs | 61 +- .../Generator/FormatterTemplate.cs | 117 +- .../Generator/FormatterTemplate.tt | 71 +- .../Generator/UnionTemplate.cs | 65 +- .../Generator/UnionTemplate.tt | 53 +- .../MessagePack.UniversalCodeGenerator.csproj | 11 +- .../Formatters/CollectionFormatter.cs | 93 +- .../Formatters/DictionaryFormatter.cs | 16 +- .../Formatters/ForceSizePrimitiveFormatter.cs | 70 +- .../Formatters/ForceSizePrimitiveFormatter.tt | 10 +- .../MultiDimentionalArrayFormatter.cs | 113 +- .../Formatters/PrimitiveObjectFormatter.cs | 24 +- .../StandardClassLibraryFormatter.cs | 24 +- src/MessagePack/Formatters/TupleFormatter.cs | 218 +- src/MessagePack/Formatters/TupleFormatter.tt | 14 +- .../Formatters/ValueTupleFormatter.cs | 216 +- .../Formatters/ValueTupleFormatter.tt | 13 +- src/MessagePack/MessagePack.csproj | 4 + src/MessagePack/MessagePackSecurity.cs | 91 + src/MessagePack/MessagePackSerializer.Json.cs | 74 +- .../Resolvers/DynamicObjectResolver.cs | 18 +- .../MessagePackSerializerTest.cs | 131 + 27 files changed, 2798 insertions(+), 2202 deletions(-) diff --git a/README.md b/README.md index 34f3cb74f..6e2a3e775 100644 --- a/README.md +++ b/README.md @@ -809,12 +809,20 @@ public class FileInfoFormatter : IMessagePackFormatter return null; } - var path = MessagePackBinary.ReadString(bytes, offset, out readSize); - return new FileInfo(path); + using (MessagePackSecurity.DepthStep()) + { + var path = MessagePackBinary.ReadString(bytes, offset, out readSize); + return new FileInfo(path); + } } } ``` +The `using (MessagePackSecurity.DepthStep())` block provides a level of security while deserializing untrusted data +that might otherwise be able to execute a denial of service attack by sending messagepack data that would +deserialize into a very deep object graph leading to a `StackOverflowException` that would crash the process. +This block should surround the bulk of any `IMessagePackFormatter.Deserialize` method. + Created formatter needs to register to `IFormatterResolver`. Please see [Extension Point section](https://github.com/neuecc/MessagePack-CSharp#extension-pointiformatterresolver). You can see many other samples from [builtin formatters](https://github.com/neuecc/MessagePack-CSharp/tree/master/src/MessagePack/Formatters). diff --git a/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj b/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj index fe5878a07..7f372c444 100644 --- a/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj +++ b/sandbox/DynamicCodeDumper/DynamicCodeDumper.csproj @@ -74,6 +74,18 @@ Code\StringEncoding.cs + + Code\MessagePackSecurity.cs + + + Code\HashCode.cs + + + Code\BitOperations.cs + + + Code\ThreadsafeTypeKeyHashTable.cs + Class1.cs diff --git a/sandbox/DynamicCodeDumper/Program.cs b/sandbox/DynamicCodeDumper/Program.cs index c75f36ffb..0c9efef52 100644 --- a/sandbox/DynamicCodeDumper/Program.cs +++ b/sandbox/DynamicCodeDumper/Program.cs @@ -36,7 +36,7 @@ static void Main(string[] args) //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); - //DynamicObjectResolver.Instance.GetFormatter(); + DynamicObjectResolver.Instance.GetFormatter(); var f = DynamicObjectResolverAllowPrivate.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); //DynamicObjectResolver.Instance.GetFormatter(); diff --git a/sandbox/Sandbox/Generated.cs b/sandbox/Sandbox/Generated.cs index 92be2e836..3c7151058 100644 --- a/sandbox/Sandbox/Generated.cs +++ b/sandbox/Sandbox/Generated.cs @@ -331,49 +331,52 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - global::SharedData.IUnionChecker result = null; - switch (key) - { - case 0: - result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 1: - result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 2: - result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 3: - result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + global::SharedData.IUnionChecker result = null; + switch (key) + { + case 0: + result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 1: + result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 2: + result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 3: + result = (global::SharedData.IUnionChecker)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } @@ -440,49 +443,52 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionChec return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker2"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionChecker2"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - global::SharedData.IUnionChecker2 result = null; - switch (key) - { - case 0: - result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 1: - result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 2: - result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 3: - result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + global::SharedData.IUnionChecker2 result = null; + switch (key) + { + case 0: + result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 1: + result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 2: + result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 3: + result = (global::SharedData.IUnionChecker2)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } @@ -534,37 +540,40 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IIVersioni return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IIVersioningUnion"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IIVersioningUnion"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - global::SharedData.IIVersioningUnion result = null; - switch (key) - { - case 0: - result = (global::SharedData.IIVersioningUnion)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + global::SharedData.IIVersioningUnion result = null; + switch (key) + { + case 0: + result = (global::SharedData.IIVersioningUnion)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } @@ -621,41 +630,44 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.RootUnionT return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.RootUnionType"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.RootUnionType"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - global::SharedData.RootUnionType result = null; - switch (key) - { - case 0: - result = (global::SharedData.RootUnionType)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 1: - result = (global::SharedData.RootUnionType)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + global::SharedData.RootUnionType result = null; + switch (key) + { + case 0: + result = (global::SharedData.RootUnionType)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 1: + result = (global::SharedData.RootUnionType)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } @@ -712,41 +724,44 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.IUnionSamp return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionSample"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:global::SharedData.IUnionSample"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - global::SharedData.IUnionSample result = null; - switch (key) - { - case 0: - result = (global::SharedData.IUnionSample)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 1: - result = (global::SharedData.IUnionSample)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + global::SharedData.IUnionSample result = null; + switch (key) + { + case 0: + result = (global::SharedData.IUnionSample)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 1: + result = (global::SharedData.IUnionSample)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } @@ -826,45 +841,48 @@ public int Serialize(ref byte[] bytes, int offset, global::IMessageBody value, g return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:global::IMessageBody"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:global::IMessageBody"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - global::IMessageBody result = null; - switch (key) - { - case 0: - result = (global::IMessageBody)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 1: - result = (global::IMessageBody)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - case 2: - result = (global::IMessageBody)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + global::IMessageBody result = null; + switch (key) + { + case 0: + result = (global::IMessageBody)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 1: + result = (global::IMessageBody)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + case 2: + result = (global::IMessageBody)formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } @@ -913,43 +931,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FirstSimpl return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Prop1__ = default(int); - var __Prop2__ = default(string); - var __Prop3__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __Prop1__ = default(int); + var __Prop2__ = default(string); + var __Prop3__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __Prop1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Prop2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __Prop3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __Prop1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Prop2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __Prop3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.FirstSimpleData(); - ____result.Prop1 = __Prop1__; - ____result.Prop2 = __Prop2__; - ____result.Prop3 = __Prop3__; - return ____result; + var ____result = new global::SharedData.FirstSimpleData(); + ____result.Prop1 = __Prop1__; + ____result.Prop2 = __Prop2__; + ____result.Prop3 = __Prop3__; + return ____result; + } } } @@ -1005,52 +1026,55 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStri return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __Prop1__ = default(int); - var __Prop2__ = default(global::SharedData.ByteEnum); - var __Prop3__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __Prop1__ = default(int); + var __Prop2__ = default(global::SharedData.ByteEnum); + var __Prop3__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __Prop1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Prop2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __Prop3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __Prop1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Prop2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __Prop3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.SimpleStringKeyData(); - ____result.Prop1 = __Prop1__; - ____result.Prop2 = __Prop2__; - ____result.Prop3 = __Prop3__; - return ____result; + var ____result = new global::SharedData.SimpleStringKeyData(); + ____result.Prop1 = __Prop1__; + ____result.Prop2 = __Prop2__; + ____result.Prop3 = __Prop3__; + return ____result; + } } } @@ -1076,43 +1100,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStru throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(int); - var __Y__ = default(int); - var __BytesSpecial__ = default(byte[]); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __X__ = default(int); + var __Y__ = default(int); + var __BytesSpecial__ = default(byte[]); + + for (int i = 0; i < length; i++) { - case 0: - __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Y__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 2: - __BytesSpecial__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Y__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 2: + __BytesSpecial__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.SimpleStructIntKeyData(); - ____result.X = __X__; - ____result.Y = __Y__; - ____result.BytesSpecial = __BytesSpecial__; - return ____result; + var ____result = new global::SharedData.SimpleStructIntKeyData(); + ____result.X = __X__; + ____result.Y = __Y__; + ____result.BytesSpecial = __BytesSpecial__; + return ____result; + } } } @@ -1159,47 +1186,50 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleStru throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(int); - var __Y__ = default(int[]); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + + var __X__ = default(int); + var __Y__ = default(int[]); + + for (int i = 0; i < length; i++) { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Y__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + + NEXT_LOOP: + offset += readSize; } - switch (key) - { - case 0: - __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Y__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } - - NEXT_LOOP: - offset += readSize; - } - - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.SimpleStructStringKeyData(); - ____result.X = __X__; - ____result.Y = __Y__; - return ____result; + var ____result = new global::SharedData.SimpleStructStringKeyData(); + ____result.X = __X__; + ____result.Y = __Y__; + return ____result; + } } } @@ -1234,63 +1264,66 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SimpleIntK return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Prop1__ = default(int); - var __Prop2__ = default(global::SharedData.ByteEnum); - var __Prop3__ = default(string); - var __Prop4__ = default(global::SharedData.SimpleStringKeyData); - var __Prop5__ = default(global::SharedData.SimpleStructIntKeyData); - var __Prop6__ = default(global::SharedData.SimpleStructStringKeyData); - var __BytesSpecial__ = default(byte[]); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __Prop1__ = default(int); + var __Prop2__ = default(global::SharedData.ByteEnum); + var __Prop3__ = default(string); + var __Prop4__ = default(global::SharedData.SimpleStringKeyData); + var __Prop5__ = default(global::SharedData.SimpleStructIntKeyData); + var __Prop6__ = default(global::SharedData.SimpleStructStringKeyData); + var __BytesSpecial__ = default(byte[]); + + for (int i = 0; i < length; i++) { - case 0: - __Prop1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Prop2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __Prop3__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 3: - __Prop4__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 4: - __Prop5__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 5: - __Prop6__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 6: - __BytesSpecial__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __Prop1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Prop2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __Prop3__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 3: + __Prop4__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 4: + __Prop5__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 5: + __Prop6__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 6: + __BytesSpecial__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.SimpleIntKeyData(); - ____result.Prop1 = __Prop1__; - ____result.Prop2 = __Prop2__; - ____result.Prop3 = __Prop3__; - ____result.Prop4 = __Prop4__; - ____result.Prop5 = __Prop5__; - ____result.Prop6 = __Prop6__; - ____result.BytesSpecial = __BytesSpecial__; - return ____result; + var ____result = new global::SharedData.SimpleIntKeyData(); + ____result.Prop1 = __Prop1__; + ____result.Prop2 = __Prop2__; + ____result.Prop3 = __Prop3__; + ____result.Prop4 = __Prop4__; + ____result.Prop5 = __Prop5__; + ____result.Prop6 = __Prop6__; + ____result.BytesSpecial = __BytesSpecial__; + return ____result; + } } } @@ -1315,36 +1348,39 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Vector2 va throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(float); - var __Y__ = default(float); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __X__ = default(float); + var __Y__ = default(float); + + for (int i = 0; i < length; i++) { - case 0: - __X__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - case 1: - __Y__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + case 1: + __Y__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Vector2(__X__, __Y__); - return ____result; + var ____result = new global::SharedData.Vector2(__X__, __Y__); + return ____result; + } } } @@ -1372,28 +1408,31 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.EmptyClass return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + + for (int i = 0; i < length; i++) { - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.EmptyClass(); - return ____result; + var ____result = new global::SharedData.EmptyClass(); + return ____result; + } } } @@ -1416,28 +1455,31 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.EmptyStruc throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + + for (int i = 0; i < length; i++) { - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.EmptyStruct(); - return ____result; + var ____result = new global::SharedData.EmptyStruct(); + return ____result; + } } } @@ -1471,43 +1513,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version1 v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(int); - var __MyProperty2__ = default(int); - var __MyProperty3__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(int); + var __MyProperty2__ = default(int); + var __MyProperty3__ = default(int); + + for (int i = 0; i < length; i++) { - case 3: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 4: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 5: - __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 3: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 4: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 5: + __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Version1(); - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty3 = __MyProperty3__; - return ____result; + var ____result = new global::SharedData.Version1(); + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty3 = __MyProperty3__; + return ____result; + } } } @@ -1543,48 +1588,51 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version2 v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(int); - var __MyProperty2__ = default(int); - var __MyProperty3__ = default(int); - var __MyProperty5__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(int); + var __MyProperty2__ = default(int); + var __MyProperty3__ = default(int); + var __MyProperty5__ = default(int); + + for (int i = 0; i < length; i++) { - case 3: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 4: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 5: - __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 7: - __MyProperty5__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 3: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 4: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 5: + __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 7: + __MyProperty5__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Version2(); - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty3 = __MyProperty3__; - ____result.MyProperty5 = __MyProperty5__; - return ____result; + var ____result = new global::SharedData.Version2(); + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty3 = __MyProperty3__; + ____result.MyProperty5 = __MyProperty5__; + return ____result; + } } } @@ -1616,33 +1664,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Version0 v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(int); + + for (int i = 0; i < length; i++) { - case 3: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 3: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Version0(); - ____result.MyProperty1 = __MyProperty1__; - return ____result; + var ____result = new global::SharedData.Version0(); + ____result.MyProperty1 = __MyProperty1__; + return ____result; + } } } @@ -1672,38 +1723,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV1 v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(global::SharedData.Version1); - var __After__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(global::SharedData.Version1); + var __After__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 1: - __After__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 1: + __After__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.HolderV1(); - ____result.MyProperty1 = __MyProperty1__; - ____result.After = __After__; - return ____result; + var ____result = new global::SharedData.HolderV1(); + ____result.MyProperty1 = __MyProperty1__; + ____result.After = __After__; + return ____result; + } } } @@ -1733,38 +1787,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV2 v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(global::SharedData.Version2); - var __After__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(global::SharedData.Version2); + var __After__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 1: - __After__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 1: + __After__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.HolderV2(); - ____result.MyProperty1 = __MyProperty1__; - ____result.After = __After__; - return ____result; + var ____result = new global::SharedData.HolderV2(); + ____result.MyProperty1 = __MyProperty1__; + ____result.After = __After__; + return ____result; + } } } @@ -1794,38 +1851,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.HolderV0 v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(global::SharedData.Version0); - var __After__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(global::SharedData.Version0); + var __After__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 1: - __After__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 1: + __After__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.HolderV0(); - ____result.MyProperty1 = __MyProperty1__; - ____result.After = __After__; - return ____result; + var ____result = new global::SharedData.HolderV0(); + ____result.MyProperty1 = __MyProperty1__; + ____result.After = __After__; + return ____result; + } } } @@ -1855,34 +1915,37 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback1 return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __X__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Callback1(__X__); - ____result.X = __X__; - ____result.OnAfterDeserialize(); - return ____result; + var ____result = new global::SharedData.Callback1(__X__); + ____result.X = __X__; + ____result.OnAfterDeserialize(); + return ____result; + } } } @@ -1912,34 +1975,37 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback1_ return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __X__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Callback1_2(__X__); - ____result.X = __X__; - ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); - return ____result; + var ____result = new global::SharedData.Callback1_2(__X__); + ____result.X = __X__; + ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); + return ____result; + } } } @@ -1983,43 +2049,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2 throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __X__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Callback2(__X__); - ____result.X = __X__; - ____result.OnAfterDeserialize(); - return ____result; + var ____result = new global::SharedData.Callback2(__X__); + ____result.X = __X__; + ____result.OnAfterDeserialize(); + return ____result; + } } } @@ -2063,43 +2132,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Callback2_ throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __X__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __X__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __X__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Callback2_2(__X__); - ____result.X = __X__; - ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); - return ____result; + var ____result = new global::SharedData.Callback2_2(__X__); + ____result.X = __X__; + ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); + return ____result; + } } } @@ -2129,38 +2201,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SubUnionTy return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(int); - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(int); + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 1: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 1: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.SubUnionType1(); - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::SharedData.SubUnionType1(); + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -2190,38 +2265,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.SubUnionTy return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty2__ = default(int); - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty2__ = default(int); + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 1: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 1: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.SubUnionType2(); - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::SharedData.SubUnionType2(); + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -2253,33 +2331,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __One__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __One__ = default(int); + + for (int i = 0; i < length; i++) { - case 3: - __One__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 3: + __One__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.MySubUnion1(); - ____result.One = __One__; - return ____result; + var ____result = new global::SharedData.MySubUnion1(); + ____result.One = __One__; + return ____result; + } } } @@ -2308,33 +2389,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Two__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __Two__ = default(int); + + for (int i = 0; i < length; i++) { - case 5: - __Two__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 5: + __Two__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.MySubUnion2(); - ____result.Two = __Two__; - return ____result; + var ____result = new global::SharedData.MySubUnion2(); + ____result.Two = __Two__; + return ____result; + } } } @@ -2365,33 +2449,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Three__ = default(int); + using (MessagePackSecurity.DepthStep()) + { + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - for (int i = 0; i < length; i++) - { - var key = i; + var __Three__ = default(int); - switch (key) + for (int i = 0; i < length; i++) { - case 2: - __Three__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 2: + __Three__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.MySubUnion3(); - ____result.Three = __Three__; - return ____result; + var ____result = new global::SharedData.MySubUnion3(); + ____result.Three = __Three__; + return ____result; + } } } @@ -2422,33 +2509,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MySubUnion throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Four__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __Four__ = default(int); + + for (int i = 0; i < length; i++) { - case 7: - __Four__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 7: + __Four__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.MySubUnion4(); - ____result.Four = __Four__; - return ____result; + var ____result = new global::SharedData.MySubUnion4(); + ____result.Four = __Four__; + return ____result; + } } } @@ -2484,33 +2574,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Versioning return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __FV__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __FV__ = default(int); + + for (int i = 0; i < length; i++) { - case 7: - __FV__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 7: + __FV__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.VersioningUnion(); - ____result.FV = __FV__; - return ____result; + var ____result = new global::SharedData.VersioningUnion(); + ____result.FV = __FV__; + return ____result; + } } } @@ -2541,43 +2634,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.MyClass va return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(int); - var __MyProperty2__ = default(int); - var __MyProperty3__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty1__ = default(int); + var __MyProperty2__ = default(int); + var __MyProperty3__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 2: - __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 2: + __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.MyClass(); - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty3 = __MyProperty3__; - return ____result; + var ____result = new global::SharedData.MyClass(); + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty3 = __MyProperty3__; + return ____result; + } } } @@ -2608,43 +2704,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.VersionBlo return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - var __UnknownBlock__ = default(global::SharedData.MyClass); - var __MyProperty2__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty__ = default(int); + var __UnknownBlock__ = default(global::SharedData.MyClass); + var __MyProperty2__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __UnknownBlock__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __UnknownBlock__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.VersionBlockTest(); - ____result.MyProperty = __MyProperty__; - ____result.UnknownBlock = __UnknownBlock__; - ____result.MyProperty2 = __MyProperty2__; - return ____result; + var ____result = new global::SharedData.VersionBlockTest(); + ____result.MyProperty = __MyProperty__; + ____result.UnknownBlock = __UnknownBlock__; + ____result.MyProperty2 = __MyProperty2__; + return ____result; + } } } @@ -2675,38 +2774,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.UnVersionB return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - var __MyProperty2__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty__ = default(int); + var __MyProperty2__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 2: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 2: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.UnVersionBlockTest(); - ____result.MyProperty = __MyProperty__; - ____result.MyProperty2 = __MyProperty2__; - return ____result; + var ____result = new global::SharedData.UnVersionBlockTest(); + ____result.MyProperty = __MyProperty__; + ____result.MyProperty2 = __MyProperty2__; + return ____result; + } } } @@ -2734,28 +2836,31 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty1 val return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + + for (int i = 0; i < length; i++) { - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Empty1(); - return ____result; + var ____result = new global::SharedData.Empty1(); + return ____result; + } } } @@ -2799,37 +2904,40 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Empty2 val return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + + for (int i = 0; i < length; i++) { - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Empty2(); - return ____result; + var ____result = new global::SharedData.Empty2(); + return ____result; + } } } @@ -2858,33 +2966,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty1 return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.NonEmpty1(); - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::SharedData.NonEmpty1(); + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -2932,42 +3043,45 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NonEmpty2 return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.NonEmpty2(); - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::SharedData.NonEmpty2(); + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -2992,38 +3106,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.VectorLike throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __x__ = default(float); - var __y__ = default(float); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __x__ = default(float); + var __y__ = default(float); + + for (int i = 0; i < length; i++) { - case 0: - __x__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - case 1: - __y__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __x__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + case 1: + __y__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.VectorLike2(__x__, __y__); - ____result.x = __x__; - ____result.y = __y__; - return ____result; + var ____result = new global::SharedData.VectorLike2(__x__, __y__); + ____result.x = __x__; + ____result.y = __y__; + return ____result; + } } } @@ -3049,43 +3166,46 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.Vector3Lik throw new InvalidOperationException("typecode is null, struct not supported"); } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __x__ = default(float); - var __y__ = default(float); - var __z__ = default(float); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __x__ = default(float); + var __y__ = default(float); + var __z__ = default(float); + + for (int i = 0; i < length; i++) { - case 0: - __x__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - case 1: - __y__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - case 2: - __z__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __x__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + case 1: + __y__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + case 2: + __z__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.Vector3Like(__x__, __y__, __z__); - ____result.x = __x__; - ____result.y = __y__; - ____result.z = __z__; - return ____result; + var ____result = new global::SharedData.Vector3Like(__x__, __y__, __z__); + ____result.x = __x__; + ____result.y = __y__; + ____result.z = __z__; + return ____result; + } } } @@ -3129,108 +3249,111 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.ArrayOptim return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty0__ = default(int); - var __MyProperty1__ = default(int); - var __MyProperty2__ = default(int); - var __MyProperty3__ = default(int); - var __MyProperty4__ = default(int); - var __MyProperty5__ = default(int); - var __MyProperty6__ = default(int); - var __MyProperty7__ = default(int); - var __MyProperty8__ = default(int); - var __MyProvperty9__ = default(int); - var __MyProperty10__ = default(int); - var __MyProperty11__ = default(int); - var __MyPropverty12__ = default(int); - var __MyPropevrty13__ = default(int); - var __MyProperty14__ = default(int); - var __MyProperty15__ = default(int); - - for (int i = 0; i < length; i++) - { - var key = i; + using (MessagePackSecurity.DepthStep()) + { + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty0__ = default(int); + var __MyProperty1__ = default(int); + var __MyProperty2__ = default(int); + var __MyProperty3__ = default(int); + var __MyProperty4__ = default(int); + var __MyProperty5__ = default(int); + var __MyProperty6__ = default(int); + var __MyProperty7__ = default(int); + var __MyProperty8__ = default(int); + var __MyProvperty9__ = default(int); + var __MyProperty10__ = default(int); + var __MyProperty11__ = default(int); + var __MyPropverty12__ = default(int); + var __MyPropevrty13__ = default(int); + var __MyProperty14__ = default(int); + var __MyProperty15__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty0__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 2: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 3: - __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 4: - __MyProperty4__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 5: - __MyProperty5__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 6: - __MyProperty6__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 7: - __MyProperty7__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 8: - __MyProperty8__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 9: - __MyProvperty9__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 10: - __MyProperty10__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 11: - __MyProperty11__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 12: - __MyPropverty12__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 13: - __MyPropevrty13__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 14: - __MyProperty14__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 15: - __MyProperty15__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty0__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 2: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 3: + __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 4: + __MyProperty4__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 5: + __MyProperty5__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 6: + __MyProperty6__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 7: + __MyProperty7__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 8: + __MyProperty8__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 9: + __MyProvperty9__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 10: + __MyProperty10__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 11: + __MyProperty11__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 12: + __MyPropverty12__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 13: + __MyPropevrty13__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 14: + __MyProperty14__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 15: + __MyProperty15__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; - - var ____result = new global::SharedData.ArrayOptimizeClass(); - ____result.MyProperty0 = __MyProperty0__; - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty3 = __MyProperty3__; - ____result.MyProperty4 = __MyProperty4__; - ____result.MyProperty5 = __MyProperty5__; - ____result.MyProperty6 = __MyProperty6__; - ____result.MyProperty7 = __MyProperty7__; - ____result.MyProperty8 = __MyProperty8__; - ____result.MyProvperty9 = __MyProvperty9__; - ____result.MyProperty10 = __MyProperty10__; - ____result.MyProperty11 = __MyProperty11__; - ____result.MyPropverty12 = __MyPropverty12__; - ____result.MyPropevrty13 = __MyPropevrty13__; - ____result.MyProperty14 = __MyProperty14__; - ____result.MyProperty15 = __MyProperty15__; - return ____result; + readSize = offset - startOffset; + + var ____result = new global::SharedData.ArrayOptimizeClass(); + ____result.MyProperty0 = __MyProperty0__; + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty3 = __MyProperty3__; + ____result.MyProperty4 = __MyProperty4__; + ____result.MyProperty5 = __MyProperty5__; + ____result.MyProperty6 = __MyProperty6__; + ____result.MyProperty7 = __MyProperty7__; + ____result.MyProperty8 = __MyProperty8__; + ____result.MyProvperty9 = __MyProvperty9__; + ____result.MyProperty10 = __MyProperty10__; + ____result.MyProperty11 = __MyProperty11__; + ____result.MyPropverty12 = __MyPropverty12__; + ____result.MyPropevrty13 = __MyPropevrty13__; + ____result.MyProperty14 = __MyProperty14__; + ____result.MyProperty15 = __MyProperty15__; + return ____result; + } } } @@ -3259,33 +3382,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.NestParent return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.NestParent.NestContract(); - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::SharedData.NestParent.NestContract(); + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -3314,33 +3440,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.FooClass v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __XYZ__ = default(int); + using (MessagePackSecurity.DepthStep()) + { + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - for (int i = 0; i < length; i++) - { - var key = i; + var __XYZ__ = default(int); - switch (key) + for (int i = 0; i < length; i++) { - case 0: - __XYZ__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __XYZ__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.FooClass(); - ____result.XYZ = __XYZ__; - return ____result; + var ____result = new global::SharedData.FooClass(); + ____result.XYZ = __XYZ__; + return ____result; + } } } @@ -3369,33 +3498,36 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.BarClass v return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __OPQ__ = default(string); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __OPQ__ = default(string); + + for (int i = 0; i < length; i++) { - case 0: - __OPQ__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __OPQ__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.BarClass(); - ____result.OPQ = __OPQ__; - return ____result; + var ____result = new global::SharedData.BarClass(); + ____result.OPQ = __OPQ__; + return ____result; + } } } @@ -3425,38 +3557,41 @@ public int Serialize(ref byte[] bytes, int offset, global::SharedData.WithIndexe return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Data1__ = default(int); - var __Data2__ = default(string); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __Data1__ = default(int); + var __Data2__ = default(string); + + for (int i = 0; i < length; i++) { - case 0: - __Data1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Data2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __Data1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Data2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SharedData.WithIndexer(); - ____result.Data1 = __Data1__; - ____result.Data2 = __Data2__; - return ____result; + var ____result = new global::SharedData.WithIndexer(); + ____result.Data1 = __Data1__; + ____result.Data2 = __Data2__; + return ____result; + } } } @@ -3501,33 +3636,36 @@ public int Serialize(ref byte[] bytes, int offset, global::Abcdefg.Efcdigjl.Atea return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::Abcdefg.Efcdigjl.Ateatatea.Hgfagfafgad.TnonodsfarnoiuAtatqaga(); - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::Abcdefg.Efcdigjl.Ateatatea.Hgfagfafgad.TnonodsfarnoiuAtatqaga(); + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -3572,33 +3710,36 @@ public int Serialize(ref byte[] bytes, int offset, global::GlobalMan value, glob return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::GlobalMan(); - ____result.MyProperty = __MyProperty__; - return ____result; + var ____result = new global::GlobalMan(); + ____result.MyProperty = __MyProperty__; + return ____result; + } } } @@ -3630,48 +3771,51 @@ public int Serialize(ref byte[] bytes, int offset, global::Message value, global return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __UserId__ = default(int); - var __RoomId__ = default(int); - var __PostTime__ = default(global::System.DateTime); - var __Body__ = default(global::IMessageBody); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __UserId__ = default(int); + var __RoomId__ = default(int); + var __PostTime__ = default(global::System.DateTime); + var __Body__ = default(global::IMessageBody); + + for (int i = 0; i < length; i++) { - case 0: - __UserId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __RoomId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 2: - __PostTime__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 3: - __Body__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __UserId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __RoomId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 2: + __PostTime__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 3: + __Body__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::Message(); - ____result.UserId = __UserId__; - ____result.RoomId = __RoomId__; - ____result.PostTime = __PostTime__; - ____result.Body = __Body__; - return ____result; + var ____result = new global::Message(); + ____result.UserId = __UserId__; + ____result.RoomId = __RoomId__; + ____result.PostTime = __PostTime__; + ____result.Body = __Body__; + return ____result; + } } } @@ -3700,33 +3844,36 @@ public int Serialize(ref byte[] bytes, int offset, global::TextMessageBody value return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __Text__ = default(string); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __Text__ = default(string); + + for (int i = 0; i < length; i++) { - case 0: - __Text__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __Text__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::TextMessageBody(); - ____result.Text = __Text__; - return ____result; + var ____result = new global::TextMessageBody(); + ____result.Text = __Text__; + return ____result; + } } } @@ -3755,33 +3902,36 @@ public int Serialize(ref byte[] bytes, int offset, global::StampMessageBody valu return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __StampId__ = default(int); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __StampId__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __StampId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __StampId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::StampMessageBody(); - ____result.StampId = __StampId__; - return ____result; + var ____result = new global::StampMessageBody(); + ____result.StampId = __StampId__; + return ____result; + } } } @@ -3811,38 +3961,41 @@ public int Serialize(ref byte[] bytes, int offset, global::QuestMessageBody valu return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __QuestId__ = default(int); - var __Text__ = default(string); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __QuestId__ = default(int); + var __Text__ = default(string); + + for (int i = 0; i < length; i++) { - case 0: - __QuestId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Text__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __QuestId__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Text__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::QuestMessageBody(); - ____result.QuestId = __QuestId__; - ____result.Text = __Text__; - return ____result; + var ____result = new global::QuestMessageBody(); + ____result.QuestId = __QuestId__; + ____result.Text = __Text__; + return ____result; + } } } @@ -3877,63 +4030,66 @@ public int Serialize(ref byte[] bytes, int offset, global::ArrayTestTest value, return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty0__ = default(int[]); - var __MyProperty1__ = default(int[,]); - var __MyProperty2__ = default(global::GlobalMyEnum[,]); - var __MyProperty3__ = default(int[,,]); - var __MyProperty4__ = default(int[,,,]); - var __MyProperty5__ = default(global::GlobalMyEnum[]); - var __MyProperty6__ = default(global::QuestMessageBody[]); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = i; + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + offset += readSize; - switch (key) + var __MyProperty0__ = default(int[]); + var __MyProperty1__ = default(int[,]); + var __MyProperty2__ = default(global::GlobalMyEnum[,]); + var __MyProperty3__ = default(int[,,]); + var __MyProperty4__ = default(int[,,,]); + var __MyProperty5__ = default(global::GlobalMyEnum[]); + var __MyProperty6__ = default(global::QuestMessageBody[]); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty0__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 1: - __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __MyProperty2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 3: - __MyProperty3__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 4: - __MyProperty4__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 5: - __MyProperty5__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 6: - __MyProperty6__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; + var key = i; + + switch (key) + { + case 0: + __MyProperty0__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 1: + __MyProperty1__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __MyProperty2__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 3: + __MyProperty3__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 4: + __MyProperty4__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 5: + __MyProperty5__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 6: + __MyProperty6__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } + offset += readSize; } - offset += readSize; - } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::ArrayTestTest(); - ____result.MyProperty0 = __MyProperty0__; - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty3 = __MyProperty3__; - ____result.MyProperty4 = __MyProperty4__; - ____result.MyProperty5 = __MyProperty5__; - ____result.MyProperty6 = __MyProperty6__; - return ____result; + var ____result = new global::ArrayTestTest(); + ____result.MyProperty0 = __MyProperty0__; + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty3 = __MyProperty3__; + ____result.MyProperty4 = __MyProperty4__; + ____result.MyProperty5 = __MyProperty5__; + ____result.MyProperty6 = __MyProperty6__; + return ____result; + } } } @@ -4001,66 +4157,69 @@ public int Serialize(ref byte[] bytes, int offset, global::SimpleModel value, gl return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __Id__ = default(int); - var __Name__ = default(string); - var __CreatedOn__ = default(global::System.DateTime); - var __Precision__ = default(int); - var __Money__ = default(decimal); - var __Amount__ = default(long); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __Id__ = default(int); + var __Name__ = default(string); + var __CreatedOn__ = default(global::System.DateTime); + var __Precision__ = default(int); + var __Money__ = default(decimal); + var __Amount__ = default(long); + + for (int i = 0; i < length; i++) { - case 0: - __Id__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __Name__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __CreatedOn__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 3: - __Precision__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 4: - __Money__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 5: - __Amount__ = MessagePackBinary.ReadInt64(bytes, offset, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __Id__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __Name__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __CreatedOn__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 3: + __Precision__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 4: + __Money__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 5: + __Amount__ = MessagePackBinary.ReadInt64(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::SimpleModel(); - ____result.Id = __Id__; - ____result.Name = __Name__; - ____result.CreatedOn = __CreatedOn__; - ____result.Precision = __Precision__; - ____result.Money = __Money__; - return ____result; + var ____result = new global::SimpleModel(); + ____result.Id = __Id__; + ____result.Name = __Name__; + ____result.CreatedOn = __CreatedOn__; + ____result.Precision = __Precision__; + ____result.Money = __Money__; + return ____result; + } } } @@ -4128,65 +4287,68 @@ public int Serialize(ref byte[] bytes, int offset, global::ComplexModel value, g return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __AdditionalProperty__ = default(global::System.Collections.Generic.IDictionary); - var __CreatedOn__ = default(global::System.DateTimeOffset); - var __Id__ = default(global::System.Guid); - var __Name__ = default(string); - var __UpdatedOn__ = default(global::System.DateTimeOffset); - var __SimpleModels__ = default(global::System.Collections.Generic.IList); - - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __AdditionalProperty__ = default(global::System.Collections.Generic.IDictionary); + var __CreatedOn__ = default(global::System.DateTimeOffset); + var __Id__ = default(global::System.Guid); + var __Name__ = default(string); + var __UpdatedOn__ = default(global::System.DateTimeOffset); + var __SimpleModels__ = default(global::System.Collections.Generic.IList); + + for (int i = 0; i < length; i++) { - case 0: - __AdditionalProperty__ = formatterResolver.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 1: - __CreatedOn__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 2: - __Id__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 3: - __Name__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 4: - __UpdatedOn__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - case 5: - __SimpleModels__ = formatterResolver.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __AdditionalProperty__ = formatterResolver.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 1: + __CreatedOn__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 2: + __Id__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 3: + __Name__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 4: + __UpdatedOn__ = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + case 5: + __SimpleModels__ = formatterResolver.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::ComplexModel(); - ____result.CreatedOn = __CreatedOn__; - ____result.Id = __Id__; - ____result.Name = __Name__; - ____result.UpdatedOn = __UpdatedOn__; - return ____result; + var ____result = new global::ComplexModel(); + ____result.CreatedOn = __CreatedOn__; + ____result.Id = __Id__; + ____result.Name = __Name__; + ____result.UpdatedOn = __UpdatedOn__; + return ____result; + } } } @@ -4282,82 +4444,85 @@ public int Serialize(ref byte[] bytes, int offset, global::PerfBenchmarkDotNet.S return null; } - var startOffset = offset; - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); - offset += readSize; - - var __MyProperty1__ = default(int); - var __MyProperty2__ = default(int); - var __MyProperty3__ = default(int); - var __MyProperty4__ = default(int); - var __MyProperty5__ = default(int); - var __MyProperty6__ = default(int); - var __MyProperty7__ = default(int); - var __MyProperty8__ = default(int); - var __MyProperty9__ = default(int); - - for (int i = 0; i < length; i++) - { - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + using (MessagePackSecurity.DepthStep()) + { + var startOffset = offset; + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } - switch (key) + var __MyProperty1__ = default(int); + var __MyProperty2__ = default(int); + var __MyProperty3__ = default(int); + var __MyProperty4__ = default(int); + var __MyProperty5__ = default(int); + var __MyProperty6__ = default(int); + var __MyProperty7__ = default(int); + var __MyProperty8__ = default(int); + var __MyProperty9__ = default(int); + + for (int i = 0; i < length; i++) { - case 0: - __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 1: - __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 2: - __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 3: - __MyProperty4__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 4: - __MyProperty5__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 5: - __MyProperty6__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 6: - __MyProperty7__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 7: - __MyProperty8__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - case 8: - __MyProperty9__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - break; - default: + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + goto NEXT_LOOP; + } + + switch (key) + { + case 0: + __MyProperty1__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 1: + __MyProperty2__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 2: + __MyProperty3__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 3: + __MyProperty4__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 4: + __MyProperty5__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 5: + __MyProperty6__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 6: + __MyProperty7__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 7: + __MyProperty8__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + case 8: + __MyProperty9__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + break; + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - NEXT_LOOP: - offset += readSize; - } + NEXT_LOOP: + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new global::PerfBenchmarkDotNet.StringKeySerializerTarget(); - ____result.MyProperty1 = __MyProperty1__; - ____result.MyProperty2 = __MyProperty2__; - ____result.MyProperty3 = __MyProperty3__; - ____result.MyProperty4 = __MyProperty4__; - ____result.MyProperty5 = __MyProperty5__; - ____result.MyProperty6 = __MyProperty6__; - ____result.MyProperty7 = __MyProperty7__; - ____result.MyProperty8 = __MyProperty8__; - ____result.MyProperty9 = __MyProperty9__; - return ____result; + var ____result = new global::PerfBenchmarkDotNet.StringKeySerializerTarget(); + ____result.MyProperty1 = __MyProperty1__; + ____result.MyProperty2 = __MyProperty2__; + ____result.MyProperty3 = __MyProperty3__; + ____result.MyProperty4 = __MyProperty4__; + ____result.MyProperty5 = __MyProperty5__; + ____result.MyProperty6 = __MyProperty6__; + ____result.MyProperty7 = __MyProperty7__; + ____result.MyProperty8 = __MyProperty8__; + ____result.MyProperty9 = __MyProperty9__; + return ____result; + } } } diff --git a/src/MessagePack.ImmutableCollection/Formatters.cs b/src/MessagePack.ImmutableCollection/Formatters.cs index 4be2b2de2..11eb42a12 100644 --- a/src/MessagePack.ImmutableCollection/Formatters.cs +++ b/src/MessagePack.ImmutableCollection/Formatters.cs @@ -45,11 +45,15 @@ public ImmutableArray Deserialize(byte[] bytes, int offset, IFormatterResolve offset += readSize; var builder = ImmutableArray.CreateBuilder(len); - for (int i = 0; i < len; i++) + using (MessagePackSecurity.DepthStep()) { - builder.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); - offset += readSize; + for (int i = 0; i < len; i++) + { + builder.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); + offset += readSize; + } } + readSize = offset - startOffset; return builder.ToImmutable(); diff --git a/src/MessagePack.ReactiveProperty/Formatters.cs b/src/MessagePack.ReactiveProperty/Formatters.cs index 334e2a1cc..007370a32 100644 --- a/src/MessagePack.ReactiveProperty/Formatters.cs +++ b/src/MessagePack.ReactiveProperty/Formatters.cs @@ -146,12 +146,15 @@ public ReactiveProperty Deserialize(byte[] bytes, int offset, IFormatterResol var scheduler = ReactivePropertySchedulerMapper.GetScheduler(schedulerId); - var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - readSize = offset - startOffset; + readSize = offset - startOffset; - return new ReactiveProperty(scheduler, v, mode); + return new ReactiveProperty(scheduler, v, mode); + } } } @@ -187,14 +190,17 @@ public IReactiveProperty Deserialize(byte[] bytes, int offset, IFormatterReso { var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - switch (length) - { - case 2: - return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - case 3: - return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - default: - throw new InvalidOperationException("Invalid ReactiveProperty or ReactivePropertySlim data."); + using (MessagePackSecurity.DepthStep()) + { + switch (length) + { + case 2: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + case 3: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + default: + throw new InvalidOperationException("Invalid ReactiveProperty or ReactivePropertySlim data."); + } } } } @@ -229,14 +235,17 @@ public IReadOnlyReactiveProperty Deserialize(byte[] bytes, int offset, IForma { var length = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); - switch (length) - { - case 2: - return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - case 3: - return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - default: - throw new InvalidOperationException("Invalid ReactiveProperty or ReactivePropertySlim data."); + using (MessagePackSecurity.DepthStep()) + { + switch (length) + { + case 2: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + case 3: + return ReactivePropertyResolver.Instance.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + default: + throw new InvalidOperationException("Invalid ReactiveProperty or ReactivePropertySlim data."); + } } } } @@ -350,14 +359,16 @@ public ReactivePropertySlim Deserialize(byte[] bytes, int offset, IFormatterR var mode = (ReactivePropertyMode)MessagePackBinary.ReadInt32(bytes, offset, out readSize); offset += readSize; - var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - readSize = offset - startOffset; + readSize = offset - startOffset; - return new ReactivePropertySlim(v, mode); + return new ReactivePropertySlim(v, mode); + } } - } } } \ No newline at end of file diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs index 0b9424e04..42337c26f 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs +++ b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.cs @@ -340,197 +340,198 @@ public virtual string TransformText() #line default #line hidden - this.Write(" }\r\n\r\n var startOffset = offset;\r\n"); + this.Write(" }\r\n\r\n using (MessagePackSecurity.DepthStep())\r\n " + + " {\r\n var startOffset = offset;\r\n"); - #line 94 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 96 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsStringKey) { #line default #line hidden - this.Write(" var length = global::MessagePack.MessagePackBinary.ReadMapHeader(byte" + - "s, offset, out readSize);\r\n"); + this.Write(" var length = global::MessagePack.MessagePackBinary.ReadMapHeader(" + + "bytes, offset, out readSize);\r\n"); - #line 96 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 98 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default #line hidden - this.Write(" var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(by" + - "tes, offset, out readSize);\r\n"); + this.Write(" var length = global::MessagePack.MessagePackBinary.ReadArrayHeade" + + "r(bytes, offset, out readSize);\r\n"); - #line 98 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 100 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - this.Write(" offset += readSize;\r\n\r\n"); + this.Write(" offset += readSize;\r\n\r\n"); - #line 101 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 103 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members) { #line default #line hidden - this.Write(" var __"); + this.Write(" var __"); - #line 102 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 104 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write("__ = default("); - #line 102 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 104 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Type)); #line default #line hidden this.Write(");\r\n"); - #line 103 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 105 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - this.Write("\r\n for (int i = 0; i < length; i++)\r\n {\r\n"); + this.Write("\r\n for (int i = 0; i < length; i++)\r\n {\r\n"); - #line 107 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 109 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsStringKey) { #line default #line hidden - this.Write(@" var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); - offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) - { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } + this.Write(@" var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + goto NEXT_LOOP; + } "); - #line 116 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 118 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else { #line default #line hidden - this.Write(" var key = i;\r\n"); + this.Write(" var key = i;\r\n"); - #line 118 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 120 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - this.Write("\r\n switch (key)\r\n {\r\n"); + this.Write("\r\n switch (key)\r\n {\r\n"); - #line 122 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 124 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members) { #line default #line hidden - this.Write(" case "); + this.Write(" case "); - #line 123 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 125 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey)); #line default #line hidden - this.Write(":\r\n __"); + this.Write(":\r\n __"); - #line 124 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 126 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write("__ = "); - #line 124 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 126 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.GetDeserializeMethodString())); #line default #line hidden - this.Write(";\r\n break;\r\n"); + this.Write(";\r\n break;\r\n"); - #line 126 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 128 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - this.Write(" default:\r\n readSize = global::MessageP" + - "ack.MessagePackBinary.ReadNextBlock(bytes, offset);\r\n bre" + - "ak;\r\n }\r\n"); + this.Write(" default:\r\n readSize = global::" + + "MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset);\r\n " + + " break;\r\n }\r\n"); - #line 131 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 133 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.IsStringKey) { #line default #line hidden - this.Write(" \r\n NEXT_LOOP:\r\n"); + this.Write(" \r\n NEXT_LOOP:\r\n"); - #line 133 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 135 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - this.Write(" offset += readSize;\r\n }\r\n\r\n readSize = offs" + - "et - startOffset;\r\n\r\n var ____result = new "); + this.Write(" offset += readSize;\r\n }\r\n\r\n rea" + + "dSize = offset - startOffset;\r\n\r\n var ____result = new "); - #line 139 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 141 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString())); #line default #line hidden this.Write(";\r\n"); - #line 140 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 142 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { #line default #line hidden - this.Write(" ____result."); + this.Write(" ____result."); - #line 141 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 143 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write(" = __"); - #line 141 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 143 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(x.Name)); #line default #line hidden this.Write("__;\r\n"); - #line 142 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 144 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - #line 143 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 145 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { #line default #line hidden - this.Write(" ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeseri" + - "alize();\r\n"); + this.Write(" ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDe" + + "serialize();\r\n"); - #line 145 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 147 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #line default #line hidden - this.Write(" ____result.OnAfterDeserialize();\r\n"); + this.Write(" ____result.OnAfterDeserialize();\r\n"); - #line 147 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 149 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default #line hidden - this.Write(" return ____result;\r\n }\r\n }\r\n\r\n"); + this.Write(" return ____result;\r\n }\r\n }\r\n }\r\n\r\n"); - #line 152 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" + #line 155 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\FormatterTemplate.tt" } #line default diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt index e05e432f4..325cb7d1d 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt +++ b/src/MessagePack.UniversalCodeGenerator/Generator/FormatterTemplate.tt @@ -90,62 +90,65 @@ namespace <#= Namespace #> <# } #> } - var startOffset = offset; + using (MessagePackSecurity.DepthStep()) + { + var startOffset = offset; <# if(objInfo.IsStringKey) { #> - var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); + var length = global::MessagePack.MessagePackBinary.ReadMapHeader(bytes, offset, out readSize); <# } else { #> - var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); + var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); <# } #> - offset += readSize; + offset += readSize; <# foreach(var x in objInfo.Members) { #> - var __<#= x.Name #>__ = default(<#= x.Type #>); + var __<#= x.Name #>__ = default(<#= x.Type #>); <# } #> - for (int i = 0; i < length; i++) - { -<# if(objInfo.IsStringKey) { #> - var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); - offset += readSize; - int key; - if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + for (int i = 0; i < length; i++) { - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - goto NEXT_LOOP; - } +<# if(objInfo.IsStringKey) { #> + var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize); + offset += readSize; + int key; + if (!____keyMapping.TryGetValueSafe(stringKey, out key)) + { + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + goto NEXT_LOOP; + } <# } else { #> - var key = i; + var key = i; <# } #> - switch (key) - { + switch (key) + { <# foreach(var x in objInfo.Members) { #> - case <#= x.IntKey #>: - __<#= x.Name #>__ = <#= x.GetDeserializeMethodString() #>; - break; + case <#= x.IntKey #>: + __<#= x.Name #>__ = <#= x.GetDeserializeMethodString() #>; + break; <# } #> - default: - readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + default: + readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } <# if(objInfo.IsStringKey) { #> - NEXT_LOOP: + NEXT_LOOP: <# } #> - offset += readSize; - } + offset += readSize; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - var ____result = new <#= objInfo.GetConstructorString() #>; + var ____result = new <#= objInfo.GetConstructorString() #>; <# foreach(var x in objInfo.Members.Where(x => x.IsWritable)) { #> - ____result.<#= x.Name #> = __<#= x.Name #>__; + ____result.<#= x.Name #> = __<#= x.Name #>__; <# } #> <#if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) { #> - ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); + ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeserialize(); <# } else if(objInfo.HasIMessagePackSerializationCallbackReceiver) { #> - ____result.OnAfterDeserialize(); + ____result.OnAfterDeserialize(); <# } #> - return ____result; + return ____result; + } } } diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs index 5ec89b29d..0be1676d7 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs +++ b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.cs @@ -217,86 +217,89 @@ public virtual string TransformText() return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException(""Invalid Union data was detected. Type:"); + var startOffset = offset; - #line 76 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException(""Invalid Union data was detected. Type:"); + + #line 78 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden this.Write(@"""); - } - offset += readSize; + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - "); + "); - #line 88 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 90 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden - this.Write(" result = null;\r\n switch (key)\r\n {\r\n"); + this.Write(" result = null;\r\n switch (key)\r\n {\r\n"); - #line 91 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 93 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #line default #line hidden - this.Write(" case "); + this.Write(" case "); - #line 92 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 94 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(i)); #line default #line hidden - this.Write(":\r\n result = ("); + this.Write(":\r\n result = ("); - #line 93 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 95 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName)); #line default #line hidden this.Write(")formatterResolver.GetFormatterWithVerify<"); - #line 93 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 95 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.Type)); #line default #line hidden this.Write(">().Deserialize(bytes, offset, formatterResolver, out readSize);\r\n " + - " offset += readSize;\r\n break;\r\n"); + " offset += readSize;\r\n break;\r\n"); - #line 96 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 98 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default #line hidden - this.Write(@" default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + this.Write(@" default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } "); - #line 108 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" + #line 111 "D:\git\MessagePack-CSharp\src\MessagePack.UniversalCodeGenerator\Generator\UnionTemplate.tt" } #line default diff --git a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt index e1578f896..833e69ee8 100644 --- a/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt +++ b/src/MessagePack.UniversalCodeGenerator/Generator/UnionTemplate.tt @@ -69,39 +69,42 @@ namespace <#= Namespace #> return null; } - var startOffset = offset; - - if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + using (MessagePackSecurity.DepthStep()) { - throw new InvalidOperationException("Invalid Union data was detected. Type:<#= info.FullName #>"); - } - offset += readSize; + var startOffset = offset; + + if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2) + { + throw new InvalidOperationException("Invalid Union data was detected. Type:<#= info.FullName #>"); + } + offset += readSize; - var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; - if (!this.keyToJumpMap.TryGetValue(key, out key)) - { - key = -1; - } + if (!this.keyToJumpMap.TryGetValue(key, out key)) + { + key = -1; + } - <#= info.FullName #> result = null; - switch (key) - { + <#= info.FullName #> result = null; + switch (key) + { <# for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i]; #> - case <#= i #>: - result = (<#= info.FullName #>)formatterResolver.GetFormatterWithVerify<<#= item.Type #>>().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - break; + case <#= i #>: + result = (<#= info.FullName #>)formatterResolver.GetFormatterWithVerify<<#= item.Type #>>().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + break; <# } #> - default: - offset += MessagePackBinary.ReadNextBlock(bytes, offset); - break; - } + default: + offset += MessagePackBinary.ReadNextBlock(bytes, offset); + break; + } - readSize = offset - startOffset; + readSize = offset - startOffset; - return result; + return result; + } } } diff --git a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj index f48305ec8..168385e07 100644 --- a/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj +++ b/src/MessagePack.UniversalCodeGenerator/MessagePack.UniversalCodeGenerator.csproj @@ -9,7 +9,7 @@ - + @@ -32,4 +32,13 @@ + + + True + + + True + + + diff --git a/src/MessagePack/Formatters/CollectionFormatter.cs b/src/MessagePack/Formatters/CollectionFormatter.cs index 495f1c52d..35cbd8732 100644 --- a/src/MessagePack/Formatters/CollectionFormatter.cs +++ b/src/MessagePack/Formatters/CollectionFormatter.cs @@ -49,11 +49,15 @@ public T[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatterRes var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new T[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -179,11 +183,15 @@ public List Deserialize(byte[] bytes, int offset, IFormatterResolver formatte var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var list = new List(len); - for (int i = 0; i < len; i++) + using (MessagePackSecurity.DepthStep()) { - list.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); - offset += readSize; + for (int i = 0; i < len; i++) + { + list.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); + offset += readSize; + } } + readSize = offset - startOffset; return list; } @@ -313,11 +321,15 @@ public TCollection Deserialize(byte[] bytes, int offset, IFormatterResolver form offset += readSize; var list = Create(len); - for (int i = 0; i < len; i++) + using (MessagePackSecurity.DepthStep()) { - Add(list, i, formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); - offset += readSize; + for (int i = 0; i < len; i++) + { + Add(list, i, formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); + offset += readSize; + } } + readSize = offset - startOffset; return Complete(list); @@ -602,14 +614,17 @@ public IGrouping Deserialize(byte[] bytes, int offset, IFormatte if (count != 2) throw new InvalidOperationException("Invalid Grouping format."); - var key = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var key = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var value = formatterResolver.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + var value = formatterResolver.GetFormatterWithVerify>().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - readSize = offset - startOffset; - return new Grouping(key, value); + readSize = offset - startOffset; + return new Grouping(key, value); + } } } } @@ -743,10 +758,13 @@ public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResol offset += readSize; var list = new T(); - for (int i = 0; i < count; i++) + using (MessagePackSecurity.DepthStep()) { - list.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); - offset += readSize; + for (int i = 0; i < count; i++) + { + list.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize)); + offset += readSize; + } } readSize = offset - startOffset; @@ -798,10 +816,13 @@ public IList Deserialize(byte[] bytes, int offset, IFormatterResolver formatterR offset += readSize; var list = new object[count]; - for (int i = 0; i < count; i++) + using (MessagePackSecurity.DepthStep()) { - list[i] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + for (int i = 0; i < count; i++) + { + list[i] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + } } readSize = offset - startOffset; @@ -848,13 +869,16 @@ public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResol offset += readSize; var dict = CollectionHelpers.CreateHashCollection(count, MessagePackSecurity.Active.GetEqualityComparer()); - for (int i = 0; i < count; i++) + using (MessagePackSecurity.DepthStep()) { - var key = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var value = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - dict.Add(key, value); + for (int i = 0; i < count; i++) + { + var key = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var value = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + dict.Add(key, value); + } } readSize = offset - startOffset; @@ -907,13 +931,16 @@ public IDictionary Deserialize(byte[] bytes, int offset, IFormatterResolver form offset += readSize; var dict = new Dictionary(count, MessagePackSecurity.Active.GetEqualityComparer()); - for (int i = 0; i < count; i++) + using (MessagePackSecurity.DepthStep()) { - var key = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var value = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - dict.Add(key, value); + for (int i = 0; i < count; i++) + { + var key = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var value = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + dict.Add(key, value); + } } readSize = offset - startOffset; diff --git a/src/MessagePack/Formatters/DictionaryFormatter.cs b/src/MessagePack/Formatters/DictionaryFormatter.cs index 08a88981b..ffb107b6e 100644 --- a/src/MessagePack/Formatters/DictionaryFormatter.cs +++ b/src/MessagePack/Formatters/DictionaryFormatter.cs @@ -87,16 +87,20 @@ public TDictionary Deserialize(byte[] bytes, int offset, IFormatterResolver form offset += readSize; var dict = Create(len); - for (int i = 0; i < len; i++) + using (MessagePackSecurity.DepthStep()) { - var key = keyFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + for (int i = 0; i < len; i++) + { + var key = keyFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var value = valueFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + var value = valueFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - Add(dict, i, key, value); + Add(dict, i, key, value); + } } + readSize = offset - startOffset; return Complete(dict); diff --git a/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.cs b/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.cs index d3d1e870d..7ea5d8ba9 100644 --- a/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.cs +++ b/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.cs @@ -97,11 +97,15 @@ public Int16[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatte var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new Int16[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadInt16(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadInt16(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -203,11 +207,15 @@ public Int32[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatte var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new Int32[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadInt32(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadInt32(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -309,11 +317,15 @@ public Int64[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatte var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new Int64[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadInt64(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadInt64(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -415,11 +427,15 @@ public UInt16[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatt var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new UInt16[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadUInt16(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadUInt16(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -521,11 +537,15 @@ public UInt32[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatt var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new UInt32[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadUInt32(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadUInt32(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -627,11 +647,15 @@ public UInt64[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatt var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new UInt64[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadUInt64(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadUInt64(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } @@ -787,11 +811,15 @@ public SByte[] Deserialize(byte[] bytes, int offset, IFormatterResolver formatte var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new SByte[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.ReadSByte(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.ReadSByte(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } diff --git a/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.tt b/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.tt index a8e54702b..9931f3561 100644 --- a/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.tt +++ b/src/MessagePack/Formatters/ForceSizePrimitiveFormatter.tt @@ -118,11 +118,15 @@ namespace MessagePack.Formatters var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); offset += readSize; var array = new <#= t.Name #>[len]; - for (int i = 0; i < array.Length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = MessagePackBinary.Read<#= t.Name #>(bytes, offset, out readSize); - offset += readSize; + for (int i = 0; i < array.Length; i++) + { + array[i] = MessagePackBinary.Read<#= t.Name #>(bytes, offset, out readSize); + offset += readSize; + } } + readSize = offset - startOffset; return array; } diff --git a/src/MessagePack/Formatters/MultiDimentionalArrayFormatter.cs b/src/MessagePack/Formatters/MultiDimentionalArrayFormatter.cs index 8e8ec0f12..2554feee3 100644 --- a/src/MessagePack/Formatters/MultiDimentionalArrayFormatter.cs +++ b/src/MessagePack/Formatters/MultiDimentionalArrayFormatter.cs @@ -67,20 +67,23 @@ public int Serialize(ref byte[] bytes, int offset, T[,] value, IFormatterResolve var i = 0; var j = -1; - for (int loop = 0; loop < maxLen; loop++) + using (MessagePackSecurity.DepthStep()) { - if (j < jLength - 1) + for (int loop = 0; loop < maxLen; loop++) { - j++; + if (j < jLength - 1) + { + j++; + } + else + { + j = 0; + i++; + } + + array[i, j] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; } - else - { - j = 0; - i++; - } - - array[i, j] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; } readSize = offset - startOffset; @@ -156,26 +159,29 @@ public int Serialize(ref byte[] bytes, int offset, T[,,] value, IFormatterResolv var i = 0; var j = 0; var k = -1; - for (int loop = 0; loop < maxLen; loop++) + using (MessagePackSecurity.DepthStep()) { - if (k < kLength - 1) - { - k++; - } - else if (j < jLength - 1) - { - k = 0; - j++; - } - else + for (int loop = 0; loop < maxLen; loop++) { - k = 0; - j = 0; - i++; + if (k < kLength - 1) + { + k++; + } + else if (j < jLength - 1) + { + k = 0; + j++; + } + else + { + k = 0; + j = 0; + i++; + } + + array[i, j, k] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; } - - array[i, j, k] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; } readSize = offset - startOffset; @@ -257,33 +263,36 @@ public int Serialize(ref byte[] bytes, int offset, T[,,,] value, IFormatterResol var j = 0; var k = 0; var l = -1; - for (int loop = 0; loop < maxLen; loop++) + using (MessagePackSecurity.DepthStep()) { - if (l < lLength - 1) + for (int loop = 0; loop < maxLen; loop++) { - l++; + if (l < lLength - 1) + { + l++; + } + else if (k < kLength - 1) + { + l = 0; + k++; + } + else if (j < jLength - 1) + { + l = 0; + k = 0; + j++; + } + else + { + l = 0; + k = 0; + j = 0; + i++; + } + + array[i, j, k, l] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; } - else if (k < kLength - 1) - { - l = 0; - k++; - } - else if (j < jLength - 1) - { - l = 0; - k = 0; - j++; - } - else - { - l = 0; - k = 0; - j = 0; - i++; - } - - array[i, j, k, l] = formatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; } readSize = offset - startOffset; diff --git a/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs b/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs index a9c29469b..85a9d5520 100644 --- a/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs +++ b/src/MessagePack/Formatters/PrimitiveObjectFormatter.cs @@ -205,10 +205,13 @@ public object Deserialize(byte[] bytes, int offset, IFormatterResolver formatter var objectFormatter = formatterResolver.GetFormatter(); var array = new object[length]; - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - array[i] = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + for (int i = 0; i < length; i++) + { + array[i] = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + } } readSize = offset - startOffset; @@ -222,15 +225,18 @@ public object Deserialize(byte[] bytes, int offset, IFormatterResolver formatter var objectFormatter = formatterResolver.GetFormatter(); var hash = new Dictionary(length, MessagePackSecurity.Active.GetEqualityComparer()); - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - var key = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + for (int i = 0; i < length; i++) + { + var key = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var value = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + var value = objectFormatter.Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - hash.Add(key, value); + hash.Add(key, value); + } } readSize = offset - startOffset; diff --git a/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs b/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs index 3a0cbb965..4fd5926ba 100644 --- a/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs +++ b/src/MessagePack/Formatters/StandardClassLibraryFormatter.cs @@ -302,14 +302,17 @@ public KeyValuePair Deserialize(byte[] bytes, int offset, IFormatt if (count != 2) throw new InvalidOperationException("Invalid KeyValuePair format."); - var key = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var key = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var value = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + var value = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - readSize = offset - startOffset; - return new KeyValuePair(key, value); + readSize = offset - startOffset; + return new KeyValuePair(key, value); + } } } @@ -486,9 +489,12 @@ public Lazy Deserialize(byte[] bytes, int offset, IFormatterResolver formatte } else { - // deserialize immediately(no delay, because capture byte[] causes memory leak) - var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - return new Lazy(() => v); + using (MessagePackSecurity.DepthStep()) + { + // deserialize immediately(no delay, because capture byte[] causes memory leak) + var v = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + return new Lazy(() => v); + } } } } diff --git a/src/MessagePack/Formatters/TupleFormatter.cs b/src/MessagePack/Formatters/TupleFormatter.cs index 7348f54d4..f87b6b451 100644 --- a/src/MessagePack/Formatters/TupleFormatter.cs +++ b/src/MessagePack/Formatters/TupleFormatter.cs @@ -37,12 +37,14 @@ public Tuple Deserialize(byte[] bytes, int offset, IFormatterResolver format var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 1) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1); + readSize = offset - startOffset; + return new Tuple(item1); + } } } } @@ -81,14 +83,16 @@ public Tuple Deserialize(byte[] bytes, int offset, IFormatterResolver fo var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 2) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2); + readSize = offset - startOffset; + return new Tuple(item1, item2); + } } } } @@ -128,16 +132,18 @@ public Tuple Deserialize(byte[] bytes, int offset, IFormatterResolve var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 3) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2, item3); + readSize = offset - startOffset; + return new Tuple(item1, item2, item3); + } } } } @@ -178,18 +184,20 @@ public Tuple Deserialize(byte[] bytes, int offset, IFormatterRes var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 4) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; - - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2, item3, item4); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new Tuple(item1, item2, item3, item4); + } } } } @@ -231,20 +239,22 @@ public Tuple Deserialize(byte[] bytes, int offset, IFormatte var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 5) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; - - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2, item3, item4, item5); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new Tuple(item1, item2, item3, item4, item5); + } } } } @@ -287,22 +297,24 @@ public Tuple Deserialize(byte[] bytes, int offset, IForm var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 6) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; - - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2, item3, item4, item5, item6); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new Tuple(item1, item2, item3, item4, item5, item6); + } } } } @@ -346,24 +358,26 @@ public Tuple Deserialize(byte[] bytes, int offset, I var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 7) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; - - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2, item3, item4, item5, item6, item7); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new Tuple(item1, item2, item3, item4, item5, item6, item7); + } } } } @@ -408,26 +422,28 @@ public Tuple Deserialize(byte[] bytes, int of var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != 8) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; - - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item8 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new Tuple(item1, item2, item3, item4, item5, item6, item7, item8); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item8 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new Tuple(item1, item2, item3, item4, item5, item6, item7, item8); + } } } } diff --git a/src/MessagePack/Formatters/TupleFormatter.tt b/src/MessagePack/Formatters/TupleFormatter.tt index 757ff9c6c..e6c3c3c6a 100644 --- a/src/MessagePack/Formatters/TupleFormatter.tt +++ b/src/MessagePack/Formatters/TupleFormatter.tt @@ -51,14 +51,16 @@ namespace MessagePack.Formatters var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize); if (count != <#= i #>) throw new InvalidOperationException("Invalid Tuple count"); offset += readSize; - + using (MessagePackSecurity.DepthStep()) + { <# for(var j = 1; j <= i; j++) { #> - var item<#= j #> = formatterResolver.GetFormatterWithVerify<<#= toT(j) #>>().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + var item<#= j #> = formatterResolver.GetFormatterWithVerify<<#= toT(j) #>>().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; <# } #> - - readSize = offset - startOffset; - return new Tuple<<#= ts #>>(<#= string.Join(", ", Enumerable.Range(1, i).Select(x => "item" + x)) #>); + + readSize = offset - startOffset; + return new Tuple<<#= ts #>>(<#= string.Join(", ", Enumerable.Range(1, i).Select(x => "item" + x)) #>); + } } } } diff --git a/src/MessagePack/Formatters/ValueTupleFormatter.cs b/src/MessagePack/Formatters/ValueTupleFormatter.cs index 87039785e..f5bbc9b41 100644 --- a/src/MessagePack/Formatters/ValueTupleFormatter.cs +++ b/src/MessagePack/Formatters/ValueTupleFormatter.cs @@ -29,11 +29,14 @@ public ValueTuple Deserialize(byte[] bytes, int offset, IFormatterResolver f if (count != 1) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1); + } } } } @@ -65,13 +68,16 @@ public ValueTuple Deserialize(byte[] bytes, int offset, IFormatterResolv if (count != 2) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2); + } } } } @@ -104,15 +110,18 @@ public ValueTuple Deserialize(byte[] bytes, int offset, IFormatterRe if (count != 3) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2, item3); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2, item3); + } } } } @@ -146,17 +155,20 @@ public ValueTuple Deserialize(byte[] bytes, int offset, IFormatt if (count != 4) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2, item3, item4); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2, item3, item4); + } } } } @@ -191,19 +203,22 @@ public ValueTuple Deserialize(byte[] bytes, int offset, IFor if (count != 5) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2, item3, item4, item5); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2, item3, item4, item5); + } } } } @@ -239,21 +254,24 @@ public ValueTuple Deserialize(byte[] bytes, int offset, if (count != 6) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2, item3, item4, item5, item6); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2, item3, item4, item5, item6); + } } } } @@ -290,23 +308,26 @@ public ValueTuple Deserialize(byte[] bytes, int offs if (count != 7) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2, item3, item4, item5, item6, item7); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2, item3, item4, item5, item6, item7); + } } } } @@ -344,25 +365,28 @@ public ValueTuple Deserialize(byte[] bytes, i if (count != 8) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; - var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - var item8 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; - - readSize = offset - startOffset; - return new ValueTuple(item1, item2, item3, item4, item5, item6, item7, item8); + using (MessagePackSecurity.DepthStep()) + { + var item1 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item2 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item3 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item4 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item5 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item6 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item7 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + var item8 = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; + + readSize = offset - startOffset; + return new ValueTuple(item1, item2, item3, item4, item5, item6, item7, item8); + } } } } diff --git a/src/MessagePack/Formatters/ValueTupleFormatter.tt b/src/MessagePack/Formatters/ValueTupleFormatter.tt index 8920d0675..73ef261a7 100644 --- a/src/MessagePack/Formatters/ValueTupleFormatter.tt +++ b/src/MessagePack/Formatters/ValueTupleFormatter.tt @@ -43,13 +43,16 @@ namespace MessagePack.Formatters if (count != <#= i #>) throw new InvalidOperationException("Invalid ValueTuple count"); offset += readSize; + using (MessagePackSecurity.DepthStep()) + { <# for(var j = 1; j <= i; j++) { #> - var item<#= j #> = formatterResolver.GetFormatterWithVerify<<#= toT(j) #>>().Deserialize(bytes, offset, formatterResolver, out readSize); - offset += readSize; + var item<#= j #> = formatterResolver.GetFormatterWithVerify<<#= toT(j) #>>().Deserialize(bytes, offset, formatterResolver, out readSize); + offset += readSize; <# } #> - - readSize = offset - startOffset; - return new ValueTuple<<#= ts #>>(<#= string.Join(", ", Enumerable.Range(1, i).Select(x => "item" + x)) #>); + + readSize = offset - startOffset; + return new ValueTuple<<#= ts #>>(<#= string.Join(", ", Enumerable.Range(1, i).Select(x => "item" + x)) #>); + } } } } diff --git a/src/MessagePack/MessagePack.csproj b/src/MessagePack/MessagePack.csproj index e936a4dc8..fceb5f41e 100644 --- a/src/MessagePack/MessagePack.csproj +++ b/src/MessagePack/MessagePack.csproj @@ -91,4 +91,8 @@ True + + + + diff --git a/src/MessagePack/MessagePackSecurity.cs b/src/MessagePack/MessagePackSecurity.cs index decfbc931..a635399ab 100644 --- a/src/MessagePack/MessagePackSecurity.cs +++ b/src/MessagePack/MessagePackSecurity.cs @@ -7,6 +7,8 @@ using System.Linq; using System.Reflection; using System.Runtime.ExceptionServices; +using System.Threading; +using MessagePack.Formatters; using MessagePack.Internal; namespace MessagePack @@ -16,6 +18,11 @@ namespace MessagePack /// public class MessagePackSecurity { + /// + /// The thread-local value tracking recursion for an ongoing deserialization operation. + /// + private static readonly ThreadLocal ObjectGraphDepth = new ThreadLocal(); + /// /// Gets an instance preconfigured with settings that omit all protections. Useful for deserializing fully-trusted and valid msgpack sequences. /// @@ -27,6 +34,7 @@ public class MessagePackSecurity public static readonly MessagePackSecurity UntrustedData = new MessagePackSecurity { HashCollisionResistant = true, + MaximumObjectGraphDepth = 500, }; /// @@ -55,6 +63,7 @@ protected MessagePackSecurity(MessagePackSecurity copyFrom) } this.HashCollisionResistant = copyFrom.HashCollisionResistant; + this.MaximumObjectGraphDepth = copyFrom.MaximumObjectGraphDepth; } /// @@ -67,6 +76,35 @@ protected MessagePackSecurity(MessagePackSecurity copyFrom) /// public bool HashCollisionResistant { get; private set; } + /// + /// Gets the maximum depth of an object graph that may be deserialized. + /// + /// + /// + /// This value can be reduced to avoid a stack overflow that would crash the process when deserializing a msgpack sequence designed to cause deep recursion. + /// A very short callstack on a thread with 1MB of total stack space might deserialize ~2000 nested arrays before crashing due to a stack overflow. + /// Since stack space occupied may vary by the kind of object deserialized, a conservative value for this property to defend against stack overflow attacks might be 500. + /// + /// + public int MaximumObjectGraphDepth { get; private set; } = int.MaxValue; + + /// + /// Gets a copy of these options with the property set to a new value. + /// + /// The new value for the property. + /// The new instance; or the original if the value is unchanged. + public MessagePackSecurity WithMaximumObjectGraphDepth(int maximumObjectGraphDepth) + { + if (this.MaximumObjectGraphDepth == maximumObjectGraphDepth) + { + return this; + } + + var clone = this.Clone(); + clone.MaximumObjectGraphDepth = maximumObjectGraphDepth; + return clone; + } + /// /// Gets a copy of these options with the property set to a new value. /// @@ -151,6 +189,35 @@ protected virtual IEqualityComparer GetHashCollisionResistantEqualityComparer throw new TypeAccessException($"No hash-resistant equality comparer available for type: {typeof(T)}"); } + /// + /// Should be called within the expression of a using statement around which a method + /// deserializes a sub-element. + /// + /// A value to be disposed of when deserializing the sub-element is complete. + /// Thrown when the depth of the object graph being deserialized exceeds . + /// + /// Rather than wrap the body of every method, + /// this should wrap *calls* to these methods. They need not appear in pure "thunk" methods that simply delegate the deserialization to another formatter. + /// In this way, we can avoid repeatedly incrementing and decrementing the counter when deserializing each element of a collection. + /// + public static ObjectGraphDepthStep DepthStep() + { + int max = Active.MaximumObjectGraphDepth; + if (max < int.MaxValue) + { + int current = ObjectGraphDepth.Value; + if (current >= max) + { + throw new InsufficientExecutionStackException($"This msgpack sequence has an object graph that exceeds the maximum depth allowed of {max}."); + } + + ObjectGraphDepth.Value = current + 1; + return new ObjectGraphDepthStep(true); + } + + return default; + } + /// /// Returns a hash collision resistant equality comparer. /// @@ -165,6 +232,30 @@ protected virtual IEqualityComparer GetHashCollisionResistantEqualityComparer /// protected virtual MessagePackSecurity Clone() => new MessagePackSecurity(this); + /// + /// The struct returned from + /// that when disposed will decrement the object graph depth counter to reverse + /// the effect of the call to . + /// + public struct ObjectGraphDepthStep : IDisposable + { + private readonly bool active; + + internal ObjectGraphDepthStep(bool active) + { + this.active = active; + } + + /// + public void Dispose() + { + if (this.active) + { + ObjectGraphDepth.Value--; + } + } + } + /// /// A hash collision resistant implementation of . /// diff --git a/src/MessagePack/MessagePackSerializer.Json.cs b/src/MessagePack/MessagePackSerializer.Json.cs index 0f96edf09..69edfe253 100644 --- a/src/MessagePack/MessagePackSerializer.Json.cs +++ b/src/MessagePack/MessagePackSerializer.Json.cs @@ -194,19 +194,22 @@ static int ToJsonCore(byte[] bytes, int offset, StringBuilder builder) var length = MessagePackBinary.ReadArrayHeaderRaw(bytes, offset, out readSize); var totalReadSize = readSize; offset += readSize; - builder.Append("["); - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - readSize = ToJsonCore(bytes, offset, builder); - offset += readSize; - totalReadSize += readSize; - - if (i != length - 1) + builder.Append("["); + for (int i = 0; i < length; i++) { - builder.Append(","); + readSize = ToJsonCore(bytes, offset, builder); + offset += readSize; + totalReadSize += readSize; + + if (i != length - 1) + { + builder.Append(","); + } } + builder.Append("]"); } - builder.Append("]"); return totalReadSize; } @@ -215,41 +218,44 @@ static int ToJsonCore(byte[] bytes, int offset, StringBuilder builder) var length = MessagePackBinary.ReadMapHeaderRaw(bytes, offset, out readSize); var totalReadSize = readSize; offset += readSize; - builder.Append("{"); - for (int i = 0; i < length; i++) + using (MessagePackSecurity.DepthStep()) { - // write key + builder.Append("{"); + for (int i = 0; i < length; i++) { - var keyType = MessagePackBinary.GetMessagePackType(bytes, offset); - if (keyType == MessagePackType.String || keyType == MessagePackType.Binary) + // write key { - readSize = ToJsonCore(bytes, offset, builder); + var keyType = MessagePackBinary.GetMessagePackType(bytes, offset); + if (keyType == MessagePackType.String || keyType == MessagePackType.Binary) + { + readSize = ToJsonCore(bytes, offset, builder); + } + else + { + builder.Append("\""); + readSize = ToJsonCore(bytes, offset, builder); + builder.Append("\""); + } + offset += readSize; + totalReadSize += readSize; } - else + + builder.Append(":"); + + // write body { - builder.Append("\""); readSize = ToJsonCore(bytes, offset, builder); - builder.Append("\""); + offset += readSize; + totalReadSize += readSize; } - offset += readSize; - totalReadSize += readSize; - } - - builder.Append(":"); - - // write body - { - readSize = ToJsonCore(bytes, offset, builder); - offset += readSize; - totalReadSize += readSize; - } - if (i != length - 1) - { - builder.Append(","); + if (i != length - 1) + { + builder.Append(","); + } } + builder.Append("}"); } - builder.Append("}"); return totalReadSize; } diff --git a/src/MessagePack/Resolvers/DynamicObjectResolver.cs b/src/MessagePack/Resolvers/DynamicObjectResolver.cs index 845bdaef6..1b8f0252b 100644 --- a/src/MessagePack/Resolvers/DynamicObjectResolver.cs +++ b/src/MessagePack/Resolvers/DynamicObjectResolver.cs @@ -804,8 +804,9 @@ static void BuildDeserialize(Type type, ObjectSerializationInfo info, ILGenerato il.Emit(OpCodes.Throw); } - // var startOffset = offset; il.MarkLabel(falseLabel); + + // var startOffset = offset; var startOffsetLocal = il.DeclareLocal(typeof(int)); // [loc:0] argOffset.EmitLoad(); il.EmitStloc(startOffsetLocal); @@ -878,6 +879,12 @@ static void BuildDeserialize(Type type, ObjectSerializationInfo info, ILGenerato .ToArray(); } + // using (MessagePackSecurity.DepthStep()) { + var depthStepLocal = il.DeclareLocal(typeof(MessagePackSecurity.ObjectGraphDepthStep)); + il.EmitCall(securityDepthStep); + il.EmitStloc(depthStepLocal); + il.BeginExceptionBlock(); + // Read Loop(for var i = 0; i< length; i++) if (info.IsStringKey) { @@ -1019,6 +1026,13 @@ static void BuildDeserialize(Type type, ObjectSerializationInfo info, ILGenerato il.Emit(OpCodes.Sub); il.Emit(OpCodes.Stind_I4); + // } // using (MessagePackSecurity.DepthStep()) + il.BeginFinallyBlock(); + il.EmitLdloca(depthStepLocal); + il.Emit(OpCodes.Constrained, typeof(MessagePackSecurity.ObjectGraphDepthStep)); + il.Emit(OpCodes.Callvirt, idisposableDispose); + il.EndExceptionBlock(); + // create result object var structLocal = EmitNewObject(il, type, info, infoList); @@ -1195,6 +1209,8 @@ static bool IsOptimizeTargetType(Type type) static readonly Type refByte = typeof(byte[]).MakeByRefType(); static readonly Type refInt = typeof(int).MakeByRefType(); static readonly MethodInfo getFormatterWithVerify = typeof(FormatterResolverExtensions).GetRuntimeMethods().First(x => x.Name == "GetFormatterWithVerify"); + private static readonly MethodInfo securityDepthStep = typeof(MessagePackSecurity).GetRuntimeMethod(nameof(MessagePackSecurity.DepthStep), Type.EmptyTypes); + private static readonly MethodInfo idisposableDispose = typeof(IDisposable).GetRuntimeMethod(nameof(IDisposable.Dispose), Type.EmptyTypes); static readonly Func getSerialize = t => typeof(IMessagePackFormatter<>).MakeGenericType(t).GetRuntimeMethod("Serialize", new[] { refByte, typeof(int), t, typeof(IFormatterResolver) }); static readonly Func getDeserialize = t => typeof(IMessagePackFormatter<>).MakeGenericType(t).GetRuntimeMethod("Deserialize", new[] { typeof(byte[]), typeof(int), typeof(IFormatterResolver), refInt }); // static readonly ConstructorInfo dictionaryConstructor = typeof(ByteArrayStringHashTable).GetTypeInfo().DeclaredConstructors.First(x => { var p = x.GetParameters(); return p.Length == 1 && p[0].ParameterType == typeof(int); }); diff --git a/tests/MessagePack.Tests/MessagePackSerializerTest.cs b/tests/MessagePack.Tests/MessagePackSerializerTest.cs index daa88d360..036ecbbc9 100644 --- a/tests/MessagePack.Tests/MessagePackSerializerTest.cs +++ b/tests/MessagePack.Tests/MessagePackSerializerTest.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using Xunit; @@ -68,6 +69,136 @@ public void StreamAPI() decompress3.IsStructuralEqual(originalData); decompress4.IsStructuralEqual(originalData); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void StackDepthCheck_Arrays(bool convertToJson) + { + var (buffer, depthExceeded) = StackDepthCheck_Helper((ref byte[] b, int offset) => MessagePackBinary.WriteArrayHeader(ref b, offset, 1)); + + if (convertToJson) + { + AssertConvertToJsonRecursionCheckThrows(buffer, depthExceeded); + } + else + { + AssertDeserializationRecursionCheckThrows(buffer, depthExceeded); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void StackDepthCheck_Maps(bool convertToJson) + { + var (sequence, options) = StackDepthCheck_Helper((ref byte[] b, int offset) => + { + int written = MessagePackBinary.WriteMapHeader(ref b, offset, 1); + written += MessagePackBinary.WriteByte(ref b, offset + written, 1); + return written; + }); + if (convertToJson) + { + AssertConvertToJsonRecursionCheckThrows(sequence, options); + } + else + { + AssertDeserializationRecursionCheckThrows(sequence, options); + } + } + + [Fact] + public void StackDepthCheck_DynamicObjectResolver() + { + var graph = new RecursiveObjectGraph + { + Child1 = new RecursiveObjectGraph + { + Child1 = new RecursiveObjectGraph { }, + }, + Child2 = new RecursiveObjectGraph + { + Child1 = new RecursiveObjectGraph { }, + }, + Child3 = new RecursiveObjectGraph + { + Child1 = new RecursiveObjectGraph { }, + }, + }; + byte[] msgpack = MessagePackSerializer.Serialize(graph); + + MessagePackSecurity.Active = MessagePackSecurity.UntrustedData.WithMaximumObjectGraphDepth(3); + try + { + MessagePackSerializer.Deserialize(msgpack); + + MessagePackSecurity.Active = MessagePackSecurity.UntrustedData.WithMaximumObjectGraphDepth(2); + Assert.Throws(() => MessagePackSerializer.Deserialize(msgpack)); + } + finally + { + MessagePackSecurity.Active = MessagePackSecurity.TrustedData; + } + } + + private delegate int WriterHelper(ref byte[] buffer, int offset); + + private static (byte[] buffer, int depthExceeded) StackDepthCheck_Helper(WriterHelper recursiveWriteOperation) + { + const int maxDepth = 3; + + var buffer = new byte[20]; + int offset = 0; + for (int i = 0; i <= maxDepth; i++) + { + offset += recursiveWriteOperation(ref buffer, offset); + } + + offset += MessagePackBinary.WriteByte(ref buffer, offset, 1); + Array.Resize(ref buffer, offset); + + return (buffer, maxDepth); + } + + private static void AssertDeserializationRecursionCheckThrows(byte[] buffer, int depthExceeded) + { + MessagePackSecurity.Active = MessagePackSecurity.UntrustedData.WithMaximumObjectGraphDepth(depthExceeded); + try + { + Assert.Throws(() => MessagePackSerializer.Deserialize(buffer)); + } + finally + { + MessagePackSecurity.Active = MessagePackSecurity.TrustedData; + } + } + + private static void AssertConvertToJsonRecursionCheckThrows(byte[] buffer, int depthExceeded) + { + MessagePackSecurity.Active = MessagePackSecurity.UntrustedData.WithMaximumObjectGraphDepth(depthExceeded); + try + { + Assert.Throws(() => MessagePackSerializer.ToJson(buffer)); + } + finally + { + MessagePackSecurity.Active = MessagePackSecurity.TrustedData; + } + } + + [DataContract] + public class RecursiveObjectGraph + { + [DataMember] + public RecursiveObjectGraph Child1 { get; set; } + + [DataMember] + public RecursiveObjectGraph Child2 { get; set; } + + [DataMember] + public RecursiveObjectGraph Child3 { get; set; } + } } class NonMemoryStream : Stream From c1e3f8bdcbfb2b73e7a787ce61fd3b25359b0993 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 14 Jan 2020 11:46:02 -0700 Subject: [PATCH 099/105] Document security measures in README --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 6e2a3e775..279ab9d51 100644 --- a/README.md +++ b/README.md @@ -509,6 +509,24 @@ MessagePack.Formatters.TypelessFormatter.BindToType = typeName => }; ``` +Security +--- + +Deserializing data from an untrusted source can introduce security vulnerabilities to your application. +Depending on the settings used during deserialization, untrusted data may be able to execute arbitrary code or a denial of service attack. +Untrusted data might come from over the Internet over an unauthenticated connection, from the local disk if it may have been tampered with, or many other sources. + +When deserializing untrusted data, put MessagePack into a more secure mode with: + +```cs +MessagePackSecurity.Active = MessagePackSecurity.UntrustedData; +``` + +In MessagePack v1.x this is a static property and thus the security level is shared by the entire process or AppDomain. +Use MessagePack v2.1 or later for better control over the security level for your particular use. + +You should also avoid the Typeless serializer/formatters/resolvers for untrusted data as that opens the door for the untrusted data to potentially deserialize unanticipated types that can compromise security. + Performance --- Benchmarks comparing to other serializers run on `Windows 10 Pro x64 Intel Core i7-6700K 4.00GHz, 32GB RAM`. Benchmark code is [here](https://github.com/neuecc/ZeroFormatter/tree/master/sandbox/PerformanceComparison) - and there [version info](https://github.com/neuecc/ZeroFormatter/blob/bc63cb925d/sandbox/PerformanceComparison/packages.config), ZeroFormatter and [FlatBuffers](https://google.github.io/flatbuffers/) has infinitely fast deserializer so ignore deserialize performance. From 86837cf73677d134de4b849ad37eae7f8ccfb892 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 30 Jan 2020 16:21:41 -0700 Subject: [PATCH 100/105] Build all v?.* branches in CI --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a9b4933d6..818fd0f1e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,6 +1,6 @@ trigger: branches: - include: ["master", "v1.8", "*_validate"] + include: ["master", "v?.*", "*_validate"] paths: exclude: ["doc", "*.md"] From 1aa93e6d58aafde42fe4f393b4fa665adb5c8594 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 30 Jan 2020 17:06:08 -0700 Subject: [PATCH 101/105] Collect nuget and vsix artifacts separately This should fix the failure of Azure Pipelines to deploy to nuget.org --- azure-pipelines/build.yml | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml index 8e4ede467..a95402b97 100644 --- a/azure-pipelines/build.yml +++ b/azure-pipelines/build.yml @@ -108,15 +108,30 @@ steps: Contents: | bin/**/$(BuildConfiguration)/**/*.nupkg bin/**/$(BuildConfiguration)/**/*.snupkg + TargetFolder: $(Build.ArtifactStagingDirectory)/nuget + flattenFolders: true + displayName: Collecting nuget + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/nuget + ArtifactName: nuget + ArtifactType: Container + displayName: Publish nuget artifacts + condition: succeededOrFailed() + +- task: CopyFiles@1 + inputs: + Contents: | bin/**/$(BuildConfiguration)/**/*.vsix - TargetFolder: $(Build.ArtifactStagingDirectory)/deployables + TargetFolder: $(Build.ArtifactStagingDirectory)/vsix flattenFolders: true - displayName: Collecting deployables + displayName: Collecting vsix - task: PublishBuildArtifacts@1 inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/deployables - ArtifactName: deployables + PathtoPublish: $(Build.ArtifactStagingDirectory)/vsix + ArtifactName: vsix ArtifactType: Container - displayName: Publish deployables artifacts + displayName: Publish vsix artifacts condition: succeededOrFailed() From a1fb68b9ab2f6721b10ccc572b825bda450d603e Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 7 Feb 2020 16:29:15 -0700 Subject: [PATCH 102/105] Fix `MessagePackSecurity.GetEqualityComparer` to not return null Fixes #810 --- src/MessagePack/MessagePackSecurity.cs | 1 + tests/MessagePack.Tests/MessagePackSecurityTests.cs | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/MessagePack/MessagePackSecurity.cs b/src/MessagePack/MessagePackSecurity.cs index a635399ab..26374a413 100644 --- a/src/MessagePack/MessagePackSecurity.cs +++ b/src/MessagePack/MessagePackSecurity.cs @@ -56,6 +56,7 @@ private MessagePackSecurity() /// /// The template to copy from. protected MessagePackSecurity(MessagePackSecurity copyFrom) + : this() { if (copyFrom is null) { diff --git a/tests/MessagePack.Tests/MessagePackSecurityTests.cs b/tests/MessagePack.Tests/MessagePackSecurityTests.cs index 37c04744f..0684e54e9 100644 --- a/tests/MessagePack.Tests/MessagePackSecurityTests.cs +++ b/tests/MessagePack.Tests/MessagePackSecurityTests.cs @@ -125,6 +125,13 @@ public void EqualityComparer_ObjectFallback() Assert.NotEqual(eq.GetHashCode(o), eq.GetHashCode(new object())); } + [Fact] + public void EqualityComparer_ObjectFallback_AfterCopyCtor() + { + var security = MessagePackSecurity.UntrustedData.WithMaximumObjectGraphDepth(15); + Assert.NotNull(security.GetEqualityComparer()); + } + /// /// Verifies that arbitrary other types not known to be hash safe will be rejected. /// From f71f24ade5e27415e14fd40805ab8913f68a2ae6 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 7 Feb 2020 15:10:43 -0700 Subject: [PATCH 103/105] Add secure hashing for enums with backing integers of 32-bit or less --- src/MessagePack/MessagePackSecurity.cs | 79 +++++++++++-------- .../MessagePackSecurityTests.cs | 48 +++++++++++ 2 files changed, 96 insertions(+), 31 deletions(-) diff --git a/src/MessagePack/MessagePackSecurity.cs b/src/MessagePack/MessagePackSecurity.cs index a635399ab..6d27259fe 100644 --- a/src/MessagePack/MessagePackSecurity.cs +++ b/src/MessagePack/MessagePackSecurity.cs @@ -156,37 +156,54 @@ public IEqualityComparer GetEqualityComparer() /// A hash collision resistant equality comparer. protected virtual IEqualityComparer GetHashCollisionResistantEqualityComparer() { - // For anything 32-bits and under, our fallback base secure hasher is usually adequate since it makes the hash unpredictable. - // We should have special implementations for any value that is larger than 32-bits in order to make sure - // that all the data gets hashed securely rather than trivially and predictably compressed into 32-bits before being hashed. - // We also have to specially handle some 32-bit types (e.g. float) where multiple in-memory representations should hash to the same value. - // Any type supported by the PrimitiveObjectFormatter should be added here if supporting it as a key in a collection makes sense. - return - // 32-bits or smaller: - typeof(T) == typeof(bool) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(char) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(sbyte) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(byte) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(short) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(ushort) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(int) ? CollisionResistantHasher.Instance : - typeof(T) == typeof(uint) ? CollisionResistantHasher.Instance : - - // Larger than 32-bits (or otherwise require special handling): - typeof(T) == typeof(long) ? (IEqualityComparer)Int64EqualityComparer.Instance : - typeof(T) == typeof(ulong) ? (IEqualityComparer)UInt64EqualityComparer.Instance : - typeof(T) == typeof(float) ? (IEqualityComparer)SingleEqualityComparer.Instance : - typeof(T) == typeof(double) ? (IEqualityComparer)DoubleEqualityComparer.Instance : - typeof(T) == typeof(string) ? (IEqualityComparer)StringEqualityComparer.Instance : - typeof(T) == typeof(Guid) ? (IEqualityComparer)GuidEqualityComparer.Instance : - typeof(T) == typeof(DateTime) ? (IEqualityComparer)DateTimeEqualityComparer.Instance : - typeof(T) == typeof(DateTimeOffset) ? (IEqualityComparer)DateTimeOffsetEqualityComparer.Instance : - typeof(T) == typeof(object) ? (IEqualityComparer)this.objectFallbackEqualityComparer : - - // Any type we don't explicitly whitelist here shouldn't be allowed to use as the key in a hash-based collection since it isn't known to be hash resistant. - // This method can of course be overridden to add more hash collision resistant type support, or the deserializing party can indicate that the data is Trusted - // so that this method doesn't even get called. - throw new TypeAccessException($"No hash-resistant equality comparer available for type: {typeof(T)}"); + IEqualityComparer result = null; + if (typeof(T).IsEnum) + { + Type underlyingType = typeof(T).GetEnumUnderlyingType(); + result = + underlyingType == typeof(sbyte) ? CollisionResistantHasher.Instance : + underlyingType == typeof(byte) ? CollisionResistantHasher.Instance : + underlyingType == typeof(short) ? CollisionResistantHasher.Instance : + underlyingType == typeof(ushort) ? CollisionResistantHasher.Instance : + underlyingType == typeof(int) ? CollisionResistantHasher.Instance : + underlyingType == typeof(uint) ? CollisionResistantHasher.Instance : + null; + } + else + { + // For anything 32-bits and under, our fallback base secure hasher is usually adequate since it makes the hash unpredictable. + // We should have special implementations for any value that is larger than 32-bits in order to make sure + // that all the data gets hashed securely rather than trivially and predictably compressed into 32-bits before being hashed. + // We also have to specially handle some 32-bit types (e.g. float) where multiple in-memory representations should hash to the same value. + // Any type supported by the PrimitiveObjectFormatter should be added here if supporting it as a key in a collection makes sense. + result = + // 32-bits or smaller: + typeof(T) == typeof(bool) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(char) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(sbyte) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(byte) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(short) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(ushort) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(int) ? CollisionResistantHasher.Instance : + typeof(T) == typeof(uint) ? CollisionResistantHasher.Instance : + + // Larger than 32-bits (or otherwise require special handling): + typeof(T) == typeof(long) ? (IEqualityComparer)Int64EqualityComparer.Instance : + typeof(T) == typeof(ulong) ? (IEqualityComparer)UInt64EqualityComparer.Instance : + typeof(T) == typeof(float) ? (IEqualityComparer)SingleEqualityComparer.Instance : + typeof(T) == typeof(double) ? (IEqualityComparer)DoubleEqualityComparer.Instance : + typeof(T) == typeof(string) ? (IEqualityComparer)StringEqualityComparer.Instance : + typeof(T) == typeof(Guid) ? (IEqualityComparer)GuidEqualityComparer.Instance : + typeof(T) == typeof(DateTime) ? (IEqualityComparer)DateTimeEqualityComparer.Instance : + typeof(T) == typeof(DateTimeOffset) ? (IEqualityComparer)DateTimeOffsetEqualityComparer.Instance : + typeof(T) == typeof(object) ? (IEqualityComparer)this.objectFallbackEqualityComparer : + null; + } + + // Any type we don't explicitly whitelist here shouldn't be allowed to use as the key in a hash-based collection since it isn't known to be hash resistant. + // This method can of course be overridden to add more hash collision resistant type support, or the deserializing party can indicate that the data is Trusted + // so that this method doesn't even get called. + return result ?? throw new TypeAccessException($"No hash-resistant equality comparer available for type: {typeof(T)}"); } /// diff --git a/tests/MessagePack.Tests/MessagePackSecurityTests.cs b/tests/MessagePack.Tests/MessagePackSecurityTests.cs index 37c04744f..b02b36649 100644 --- a/tests/MessagePack.Tests/MessagePackSecurityTests.cs +++ b/tests/MessagePack.Tests/MessagePackSecurityTests.cs @@ -106,6 +106,22 @@ public unsafe void EqualityComparer_Double() Assert.NotEqual(eq.GetHashCode(1.0), eq.GetHashCode(2.0)); } + [Fact] + public void EqualityComparer_Enums() + { + Assert.NotNull(MessagePackSecurity.UntrustedData.GetEqualityComparer()); + Assert.NotNull(MessagePackSecurity.UntrustedData.GetEqualityComparer()); + Assert.NotNull(MessagePackSecurity.UntrustedData.GetEqualityComparer()); + Assert.NotNull(MessagePackSecurity.UntrustedData.GetEqualityComparer()); + Assert.NotNull(MessagePackSecurity.UntrustedData.GetEqualityComparer()); + Assert.NotNull(MessagePackSecurity.UntrustedData.GetEqualityComparer()); + + // Supporting enums with backing integers that exceed 32-bits would likely require Ref.Emit of new types + // since C# doesn't let us cast T to the underlying int type. + Assert.Throws(() => MessagePackSecurity.UntrustedData.GetEqualityComparer()); + Assert.Throws(() => MessagePackSecurity.UntrustedData.GetEqualityComparer()); + } + [Fact] public void EqualityComparer_ObjectFallback() { @@ -190,4 +206,36 @@ public void TypelessFormatterWithUntrustedData_UnsafeKeys() public class ArbitraryType { } + + public enum SomeInt8Enum : sbyte + { + } + + public enum SomeUInt8Enum : byte + { + } + + public enum SomeInt16Enum : short + { + } + + public enum SomeUInt16Enum : ushort + { + } + + public enum SomeInt32Enum : int + { + } + + public enum SomeUInt32Enum : uint + { + } + + public enum SomeInt64Enum : long + { + } + + public enum SomeUInt64Enum : ulong + { + } } From 93015bbd8f9fd1cd43b20dca90050ec3b1b97b69 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 7 Feb 2020 17:00:29 -0700 Subject: [PATCH 104/105] Fix compile break on netstandard1.6 build --- src/MessagePack/MessagePackSecurity.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MessagePack/MessagePackSecurity.cs b/src/MessagePack/MessagePackSecurity.cs index 15985f37e..d8e831816 100644 --- a/src/MessagePack/MessagePackSecurity.cs +++ b/src/MessagePack/MessagePackSecurity.cs @@ -158,9 +158,9 @@ public IEqualityComparer GetEqualityComparer() protected virtual IEqualityComparer GetHashCollisionResistantEqualityComparer() { IEqualityComparer result = null; - if (typeof(T).IsEnum) + if (typeof(T).GetTypeInfo().IsEnum) { - Type underlyingType = typeof(T).GetEnumUnderlyingType(); + Type underlyingType = typeof(T).GetTypeInfo().GetEnumUnderlyingType(); result = underlyingType == typeof(sbyte) ? CollisionResistantHasher.Instance : underlyingType == typeof(byte) ? CollisionResistantHasher.Instance : From 6cbd8196e7dbe9b8810d7620f4542c3db9388753 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Mon, 10 Feb 2020 13:58:44 -0700 Subject: [PATCH 105/105] Build public releases from v1.x branch --- version.json | 1 + 1 file changed, 1 insertion(+) diff --git a/version.json b/version.json index 8cc8ee638..3d0a416bd 100644 --- a/version.json +++ b/version.json @@ -3,6 +3,7 @@ "version": "1.9", "publicReleaseRefSpec": [ "^refs/heads/master$", + "^refs/heads/v1\\.x$", "^refs/heads/v\\d+(?:.\\d+)?$" ] } \ No newline at end of file