You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/07/13 17:47:58 UTC

[10/52] [abbrv] tinkerpop git commit: Add Gremlin-CSharp and Gremlin-DotNet

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteTraversalSideEffects.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteTraversalSideEffects.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteTraversalSideEffects.cs
new file mode 100644
index 0000000..8ce495d
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteTraversalSideEffects.cs
@@ -0,0 +1,126 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Gremlin.Net.Driver.Messages;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.Net.Driver.Remote
+{
+    internal class DriverRemoteTraversalSideEffects : ITraversalSideEffects
+    {
+        private readonly IGremlinClient _gremlinClient;
+        private readonly List<string> _keys = new List<string>();
+        private readonly Guid _serverSideEffectId;
+        private readonly Dictionary<string, object> _sideEffects = new Dictionary<string, object>();
+        private bool _closed;
+        private bool _retrievedAllKeys;
+
+        public DriverRemoteTraversalSideEffects(IGremlinClient gremlinClient, Guid serverSideEffectId)
+        {
+            _gremlinClient = gremlinClient;
+            _serverSideEffectId = serverSideEffectId;
+        }
+
+        public void Dispose()
+        {
+            Close();
+        }
+
+        public IReadOnlyCollection<string> Keys()
+        {
+            if (_closed && !_retrievedAllKeys)
+                throw new InvalidOperationException("Traversal has been closed - side-effect keys cannot be retrieved");
+            if (!_retrievedAllKeys)
+            {
+                _keys.AddRange(RetrieveKeys());
+                _retrievedAllKeys = true;
+            }
+            return _keys;
+        }
+
+        private IEnumerable<string> RetrieveKeys()
+        {
+            return _gremlinClient.SubmitAsync<string>(SideEffectKeysMessage()).Result;
+        }
+
+        private RequestMessage SideEffectKeysMessage()
+        {
+            return RequestMessage.Build(Tokens.OpsKeys)
+                .AddArgument(Tokens.ArgsSideEffect, _serverSideEffectId)
+                .Processor(Tokens.ProcessorTraversal)
+                .Create();
+        }
+
+        public object Get(string key)
+        {
+            if (!Keys().Contains(key))
+                throw new KeyNotFoundException($"Side effect key {key} does not exist");
+            if (!_sideEffects.ContainsKey(key))
+            {
+                if (_closed)
+                    throw new InvalidOperationException(
+                        "Traversal has been closed - no new side-effects can be retrieved");
+                _sideEffects.Add(key, RetrieveSideEffectsForKey(key));
+            }
+            return _sideEffects[key];
+        }
+
+        private object RetrieveSideEffectsForKey(string key)
+        {
+            return _gremlinClient.SubmitWithSingleResultAsync<object>(SideEffectGatherMessage(key)).Result;
+        }
+
+        private RequestMessage SideEffectGatherMessage(string key)
+        {
+            return RequestMessage.Build(Tokens.OpsGather)
+                .AddArgument(Tokens.ArgsSideEffect, _serverSideEffectId)
+                .AddArgument(Tokens.ArgsSideEffectKey, key)
+                .AddArgument(Tokens.ArgsAliases, new Dictionary<string, string> {{"g", "g"}})
+                .Processor(Tokens.ProcessorTraversal)
+                .Create();
+        }
+
+        public void Close()
+        {
+            if (_closed) return;
+            CloseSideEffects();
+            _closed = true;
+        }
+
+        private void CloseSideEffects()
+        {
+            _gremlinClient.SubmitAsync<object>(SideEffectCloseMessage()).Wait();
+        }
+
+        private RequestMessage SideEffectCloseMessage()
+        {
+            return RequestMessage.Build(Tokens.OpsClose)
+                .AddArgument(Tokens.ArgsSideEffect, _serverSideEffectId)
+                .Processor(Tokens.ProcessorTraversal)
+                .Create();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/AggregatorFactory.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/AggregatorFactory.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/AggregatorFactory.cs
new file mode 100644
index 0000000..26efb5d
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/AggregatorFactory.cs
@@ -0,0 +1,44 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Driver.ResultsAggregation
+{
+    internal class AggregatorFactory
+    {
+        private readonly Dictionary<string, IAggregator> _aggregatorByAggregateToType =
+            new Dictionary<string, IAggregator>
+            {
+                {Tokens.ValAggregateToMap, new DictionaryAggregator()},
+                {Tokens.ValAggregateToBulkSet, new TraverserAggregator()}
+            };
+
+        public IAggregator GetAggregatorFor(string aggregateTo)
+        {
+            if (_aggregatorByAggregateToType.ContainsKey(aggregateTo))
+                return _aggregatorByAggregateToType[aggregateTo];
+            return new DefaultAggregator();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DefaultAggregator.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DefaultAggregator.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DefaultAggregator.cs
new file mode 100644
index 0000000..82b247b
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DefaultAggregator.cs
@@ -0,0 +1,42 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Driver.ResultsAggregation
+{
+    internal class DefaultAggregator : IAggregator
+    {
+        private readonly List<dynamic> _result = new List<dynamic>();
+
+        public void Add(object value)
+        {
+            _result.Add(value);
+        }
+
+        public object GetAggregatedResult()
+        {
+            return _result;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DictionaryAggregator.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DictionaryAggregator.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DictionaryAggregator.cs
new file mode 100644
index 0000000..75764e3
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/DictionaryAggregator.cs
@@ -0,0 +1,44 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Gremlin.Net.Driver.ResultsAggregation
+{
+    internal class DictionaryAggregator : IAggregator
+    {
+        private readonly Dictionary<string, dynamic> _result = new Dictionary<string, dynamic>();
+
+        public void Add(object value)
+        {
+            var newEntry = ((Dictionary<string, dynamic>) value).First();
+            _result.Add(newEntry.Key, newEntry.Value);
+        }
+
+        public object GetAggregatedResult()
+        {
+            return _result;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/IAggregator.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/IAggregator.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/IAggregator.cs
new file mode 100644
index 0000000..bcc036a
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/IAggregator.cs
@@ -0,0 +1,31 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+namespace Gremlin.Net.Driver.ResultsAggregation
+{
+    internal interface IAggregator
+    {
+        void Add(object value);
+        object GetAggregatedResult();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/TraverserAggregator.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/TraverserAggregator.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/TraverserAggregator.cs
new file mode 100644
index 0000000..2d18804
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ResultsAggregation/TraverserAggregator.cs
@@ -0,0 +1,44 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.Net.Driver.ResultsAggregation
+{
+    internal class TraverserAggregator : IAggregator
+    {
+        private readonly Dictionary<object, long> _result = new Dictionary<object, long>();
+
+        public void Add(object value)
+        {
+            var traverser = (Traverser) value;
+            _result.Add(traverser.Object, traverser.Bulk);
+        }
+
+        public object GetAggregatedResult()
+        {
+            return _result;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs
new file mode 100644
index 0000000..5a940cd
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs
@@ -0,0 +1,114 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using Gremlin.Net.Driver.Messages;
+
+namespace Gremlin.Net.Driver
+{
+    /// <summary>
+    ///     String constants used to configure a <see cref="RequestMessage" />.
+    /// </summary>
+    public class Tokens
+    {
+        /// <summary>
+        ///     Operation used for a request that contains the Bytecode representation of a Traversal.
+        /// </summary>
+        public static string OpsBytecode = "bytecode";
+
+        /// <summary>
+        ///     Operation used to evaluate a Gremlin script provided as a string.
+        /// </summary>
+        public static string OpsEval = "eval";
+
+        /// <summary>
+        ///     Operation used to get a particular side-effect as produced by a previously executed Traversal.
+        /// </summary>
+        public static string OpsGather = "gather";
+
+        /// <summary>
+        ///     Operation used to get all the keys of all side-effects as produced by a previously executed Traversal.
+        /// </summary>
+        public static string OpsKeys = "keys";
+
+        /// <summary>
+        ///     Operation used to get all the keys of all side-effects as produced by a previously executed Traversal.
+        /// </summary>
+        public static string OpsClose = "close";
+
+        /// <summary>
+        ///     Default OpProcessor.
+        /// </summary>
+        public static string ProcessorTraversal = "traversal";
+
+        /// <summary>
+        ///     Argument name that allows to defines the number of iterations each ResponseMessage should contain - overrides the
+        ///     resultIterationBatchSize server setting.
+        /// </summary>
+        public static string ArgsBatchSize = "batchSize";
+
+        /// <summary>
+        ///     Argument name that allows to provide a map of key/value pairs to apply as variables in the context of the Gremlin
+        ///     script.
+        /// </summary>
+        public static string ArgsBindings = "bindings";
+
+        /// <summary>
+        ///     Argument name that allows to define aliases that represent globally bound Graph and TraversalSource objects.
+        /// </summary>
+        public static string ArgsAliases = "aliases";
+
+        /// <summary>
+        ///     Argument name that corresponds to the Traversal to evaluate.
+        /// </summary>
+        public static string ArgsGremlin = "gremlin";
+
+        /// <summary>
+        ///     Argument name that allows to specify the unique identifier for the request.
+        /// </summary>
+        public static string ArgsSideEffect = "sideEffect";
+
+        /// <summary>
+        ///     Argument name that allows to specify the key for a specific side-effect.
+        /// </summary>
+        public static string ArgsSideEffectKey = "sideEffectKey";
+
+        /// <summary>
+        ///     <see cref="ResponseMessage{T}" /> argument that describes how side-effect data should be treated.
+        /// </summary>
+        public static string ArgsAggregateTo = "aggregateTo";
+
+        /// <summary>
+        ///     Argument name that allows to change the flavor of Gremlin used (e.g. gremlin-groovy).
+        /// </summary>
+        public static string ArgsLanguage = "language";
+
+        /// <summary>
+        ///     Argument name that allows to override the server setting that determines the maximum time to wait for a script to
+        ///     execute on the server.
+        /// </summary>
+        public static string ArgsEvalTimeout = "scriptEvaluationTimeout";
+
+        internal static string ValAggregateToMap = "map";
+        internal static string ValAggregateToBulkSet = "bulkset";
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs
new file mode 100644
index 0000000..5a20759
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs
@@ -0,0 +1,96 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using System.IO;
+using System.Net.WebSockets;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Gremlin.Net.Driver
+{
+    internal class WebSocketConnection : IDisposable
+    {
+        private const int ReceiveBufferSize = 1024;
+        private const WebSocketMessageType MessageType = WebSocketMessageType.Binary;
+        private ClientWebSocket _client;
+
+        public async Task ConnectAsync(Uri uri)
+        {
+            _client = new ClientWebSocket();
+            await _client.ConnectAsync(uri, CancellationToken.None).ConfigureAwait(false);
+        }
+
+        public async Task CloseAsync()
+        {
+            await
+                _client.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None)
+                    .ConfigureAwait(false);
+        }
+
+        public async Task SendMessageAsync(byte[] message)
+        {
+            await
+                _client.SendAsync(new ArraySegment<byte>(message), MessageType, true, CancellationToken.None)
+                    .ConfigureAwait(false);
+        }
+
+        public async Task<byte[]> ReceiveMessageAsync()
+        {
+            using (var ms = new MemoryStream())
+            {
+                WebSocketReceiveResult received;
+                do
+                {
+                    var receiveBuffer = new ArraySegment<byte>(new byte[ReceiveBufferSize]);
+                    received = await _client.ReceiveAsync(receiveBuffer, CancellationToken.None).ConfigureAwait(false);
+                    ms.Write(receiveBuffer.Array, receiveBuffer.Offset, received.Count);
+                } while (!received.EndOfMessage);
+
+                return ms.ToArray();
+            }
+        }
+
+        #region IDisposable Support
+
+        private bool _disposed;
+
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!_disposed)
+            {
+                if (disposing)
+                    _client?.Dispose();
+                _disposed = true;
+            }
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj b/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj
new file mode 100644
index 0000000..a909ad1
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj
@@ -0,0 +1,43 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  
+  <PropertyGroup>
+    <Description>Gremlin.Net is a cross-platform Gremlin Server driver for .NET that is written in C#. It uses WebSockets to communicate with Gremlin Server.</Description>
+    <AssemblyTitle>Gremlin.Net</AssemblyTitle>
+    <Authors>Apache TinkerPop</Authors>
+    <TargetFramework>netstandard1.3</TargetFramework>
+    <Version>3.2.5-SNAPSHOT</Version>
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <AssemblyName>Gremlin.Net</AssemblyName>
+    <PackageId>Gremlin.Net</PackageId>
+    <PackageTags>gremlin-dotnet;gremlin;tinkerpop;tinkerpop3</PackageTags>
+    <PackageProjectUrl>http://tinkerpop.apache.org</PackageProjectUrl>
+    <PackageLicenseUrl>https://github.com/apache/tinkerpop/blob/master/LICENSE</PackageLicenseUrl>
+    <RepositoryUrl>https://github.com/apache/tinkerpop</RepositoryUrl>
+    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
+    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
+    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
+    <GeneratePackageOnBuild>False</GeneratePackageOnBuild>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <DocumentationFile />
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="System.Collections" Version="4.3.0" />
+    <PackageReference Include="System.Linq" Version="4.3.0" />
+    <PackageReference Include="System.Runtime" Version="4.3.0" />
+    <PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
+    <PackageReference Include="System.Threading" Version="4.3.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
+    <PackageReference Include="System.Net.WebSockets" Version="4.3.0" />
+    <PackageReference Include="System.Net.WebSockets.Client" Version="4.3.0" />
+    <PackageReference Include="System.Collections.Concurrent" Version="4.3.0" />
+    <PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Gremlin.Net.Process\Gremlin.Net.Process.csproj" />
+  </ItemGroup>
+
+</Project>

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Properties/AssemblyInfo.cs b/gremlin-dotnet/src/Gremlin.Net/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..433db19
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Properties/AssemblyInfo.cs
@@ -0,0 +1,44 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+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: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Gremlin.Net")]
+[assembly: AssemblyTrademark("")]
+
+// 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)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+
+[assembly: Guid("6c1dd34d-e30f-4e37-aacc-beb8ad2320d8")]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/Edge.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/Edge.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/Edge.cs
new file mode 100644
index 0000000..fddbd69
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/Edge.cs
@@ -0,0 +1,61 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+namespace Gremlin.Net.Structure
+{
+    /// <summary>
+    ///     Represents an edge between to vertices.
+    /// </summary>
+    public class Edge : Element
+    {
+        /// <summary>
+        ///     Initializes a new instance of the <see cref="Edge" /> class.
+        /// </summary>
+        /// <param name="id">The id of the edge.</param>
+        /// <param name="outV">The outgoing/tail vertex of the edge.</param>
+        /// <param name="label">The label of the edge.</param>
+        /// <param name="inV">The incoming/head vertex of the edge.</param>
+        public Edge(object id, Vertex outV, string label, Vertex inV)
+            : base(id, label)
+        {
+            OutV = outV;
+            InV = inV;
+        }
+
+        /// <summary>
+        ///     Gets or sets the incoming/head vertex of this edge.
+        /// </summary>
+        public Vertex InV { get; set; }
+
+        /// <summary>
+        ///     Gets or sets the outgoing/tail vertex of this edge.
+        /// </summary>
+        public Vertex OutV { get; set; }
+
+        /// <inheritdoc />
+        public override string ToString()
+        {
+            return $"e[{Id}][{OutV.Id}-{Label}->{InV.Id}]";
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/Element.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/Element.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/Element.cs
new file mode 100644
index 0000000..f4fc847
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/Element.cs
@@ -0,0 +1,77 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+
+namespace Gremlin.Net.Structure
+{
+    /// <summary>
+    ///     A common base class for Graph elements.
+    /// </summary>
+    public abstract class Element : IEquatable<Element>
+    {
+        /// <summary>
+        ///     Initializes a new instance of the <see cref="Element" /> class.
+        /// </summary>
+        /// <param name="id">The id of the element.</param>
+        /// <param name="label">The label of the element.</param>
+        protected Element(object id, string label)
+        {
+            Id = id;
+            Label = label;
+        }
+
+        /// <summary>
+        ///     Gets the id of this <see cref="Element" />.
+        /// </summary>
+        public object Id { get; }
+
+        /// <summary>
+        ///     Gets the label of this <see cref="Element" />.
+        /// </summary>
+        public string Label { get; }
+
+        /// <inheritdoc />
+        public bool Equals(Element other)
+        {
+            if (ReferenceEquals(null, other)) return false;
+            if (ReferenceEquals(this, other)) return true;
+            return Equals(Id, other.Id);
+        }
+
+        /// <inheritdoc />
+        public override bool Equals(object obj)
+        {
+            if (ReferenceEquals(null, obj)) return false;
+            if (ReferenceEquals(this, obj)) return true;
+            if (obj.GetType() != GetType()) return false;
+            return Equals((Element) obj);
+        }
+
+        /// <inheritdoc />
+        public override int GetHashCode()
+        {
+            return Id.GetHashCode();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BindingSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BindingSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BindingSerializer.cs
new file mode 100644
index 0000000..d183447
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BindingSerializer.cs
@@ -0,0 +1,42 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class BindingSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            var binding = (Binding) objectData;
+            var valueDict = new Dictionary<string, object>
+            {
+                {"value", writer.ToDict(binding.Value)},
+                {"key", binding.Key}
+            };
+            return GraphSONUtil.ToTypedValue(nameof(Binding), valueDict);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BytecodeSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BytecodeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BytecodeSerializer.cs
new file mode 100644
index 0000000..28cfe0a
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/BytecodeSerializer.cs
@@ -0,0 +1,58 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class BytecodeSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic bytecodeObj, GraphSONWriter writer)
+        {
+            Bytecode bytecode = bytecodeObj;
+
+            var valueDict = new Dictionary<string, IEnumerable<IEnumerable<dynamic>>>();
+            if (bytecode.SourceInstructions.Count > 0)
+                valueDict["source"] = DictifyInstructions(bytecode.SourceInstructions, writer);
+            if (bytecode.StepInstructions.Count > 0)
+                valueDict["step"] = DictifyInstructions(bytecode.StepInstructions, writer);
+
+            return GraphSONUtil.ToTypedValue(nameof(Bytecode), valueDict);
+        }
+
+        private IEnumerable<IEnumerable<dynamic>> DictifyInstructions(IEnumerable<Instruction> instructions,
+            GraphSONWriter writer)
+        {
+            return instructions.Select(instruction => DictifyInstruction(instruction, writer));
+        }
+
+        private IEnumerable<dynamic> DictifyInstruction(Instruction instruction, GraphSONWriter writer)
+        {
+            var result = new List<dynamic> {instruction.OperatorName};
+            result.AddRange(instruction.Arguments.Select(arg => writer.ToDict(arg)));
+            return result;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateDeserializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateDeserializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateDeserializer.cs
new file mode 100644
index 0000000..d8879f8
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateDeserializer.cs
@@ -0,0 +1,43 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class DateDeserializer : IGraphSONDeserializer
+    {
+        public dynamic Objectify(JToken graphsonObject, GraphSONReader reader)
+        {
+            var javaTimestamp = graphsonObject.ToObject<long>();
+            return FromJavaTime(javaTimestamp);
+        }
+
+        private DateTime FromJavaTime(long javaTimestamp)
+        {
+            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+            return epoch.AddMilliseconds(javaTimestamp);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateSerializer.cs
new file mode 100644
index 0000000..1438e02
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DateSerializer.cs
@@ -0,0 +1,43 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class DateSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            DateTime dateTime = objectData;
+            return GraphSONUtil.ToTypedValue("Date", ToJavaTimestamp(dateTime));
+        }
+
+        private long ToJavaTimestamp(DateTime dateTime)
+        {
+            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+            return Convert.ToInt64((dateTime - epoch).TotalMilliseconds);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DoubleConverter.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DoubleConverter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DoubleConverter.cs
new file mode 100644
index 0000000..416423b
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/DoubleConverter.cs
@@ -0,0 +1,33 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class DoubleConverter : NumberConverter
+    {
+        protected override string GraphSONTypeName => "Double";
+        protected override Type HandledType => typeof(double);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeDeserializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeDeserializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeDeserializer.cs
new file mode 100644
index 0000000..6ec8694
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeDeserializer.cs
@@ -0,0 +1,43 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class EdgeDeserializer : IGraphSONDeserializer
+    {
+        public dynamic Objectify(JToken graphsonObject, GraphSONReader reader)
+        {
+            var outVId = reader.ToObject(graphsonObject["outV"]);
+            var outVLabel = (string) (graphsonObject["outVLabel"] ?? Vertex.DefaultLabel);
+            var outV = new Vertex(outVId, outVLabel);
+            var inVId = reader.ToObject(graphsonObject["inV"]);
+            var inVLabel = (string) (graphsonObject["inVLabel"] ?? Vertex.DefaultLabel);
+            var inV = new Vertex(inVId, inVLabel);
+            var edgeId = reader.ToObject(graphsonObject["id"]);
+            var edgeLabel = (string) graphsonObject["label"] ?? "edge";
+            return new Edge(edgeId, outV, edgeLabel, inV);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeSerializer.cs
new file mode 100644
index 0000000..fd9f496
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EdgeSerializer.cs
@@ -0,0 +1,45 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class EdgeSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            Edge edge = objectData;
+            var edgeDict = new Dictionary<string, dynamic>
+            {
+                {"id", writer.ToDict(edge.Id)},
+                {"outV", writer.ToDict(edge.OutV.Id)},
+                {"outVLabel", edge.OutV.Label},
+                {"label", edge.Label},
+                {"inV", writer.ToDict(edge.InV.Id)},
+                {"inVLabel", edge.InV.Label}
+            };
+            return GraphSONUtil.ToTypedValue(nameof(Edge), edgeDict);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EnumSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EnumSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EnumSerializer.cs
new file mode 100644
index 0000000..6ed3cd4
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/EnumSerializer.cs
@@ -0,0 +1,37 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class EnumSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            var enumName = objectData.GetType().Name;
+            var enumValue = objectData.ToString();
+            return GraphSONUtil.ToTypedValue(enumName, enumValue);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/FloatConverter.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/FloatConverter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/FloatConverter.cs
new file mode 100644
index 0000000..432aeab
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/FloatConverter.cs
@@ -0,0 +1,33 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class FloatConverter : NumberConverter
+    {
+        protected override string GraphSONTypeName => "Float";
+        protected override Type HandledType => typeof(float);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONReader.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONReader.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONReader.cs
new file mode 100644
index 0000000..aa1fc48
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONReader.cs
@@ -0,0 +1,123 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    /// <summary>
+    ///     Allows to deserialize GraphSON to objects.
+    /// </summary>
+    public class GraphSONReader
+    {
+        private readonly Dictionary<string, IGraphSONDeserializer> _deserializerByGraphSONType = new Dictionary
+            <string, IGraphSONDeserializer>
+            {
+                {"g:Traverser", new TraverserReader()},
+                {"g:Int32", new Int32Converter()},
+                {"g:Int64", new Int64Converter()},
+                {"g:Float", new FloatConverter()},
+                {"g:Double", new DoubleConverter()},
+                {"g:UUID", new UuidDeserializer()},
+                {"g:Date", new DateDeserializer()},
+                {"g:Timestamp", new DateDeserializer()},
+                {"g:Vertex", new VertexDeserializer()},
+                {"g:Edge", new EdgeDeserializer()},
+                {"g:Property", new PropertyDeserializer()},
+                {"g:VertexProperty", new VertexPropertyDeserializer()},
+                {"g:Path", new PathDeserializer()}
+            };
+
+        /// <summary>
+        ///     Initializes a new instance of the <see cref="GraphSONReader" /> class.
+        /// </summary>
+        public GraphSONReader()
+        {
+        }
+
+        /// <summary>
+        ///     Initializes a new instance of the <see cref="GraphSONReader" /> class.
+        /// </summary>
+        /// <param name="deserializerByGraphSONType">
+        ///     <see cref="IGraphSONDeserializer" /> deserializers identified by their
+        ///     GraphSON type.
+        /// </param>
+        public GraphSONReader(IReadOnlyDictionary<string, IGraphSONDeserializer> deserializerByGraphSONType)
+        {
+            foreach (var deserializerAndGraphSONType in deserializerByGraphSONType)
+                _deserializerByGraphSONType[deserializerAndGraphSONType.Key] = deserializerAndGraphSONType.Value;
+        }
+
+        /// <summary>
+        ///     Deserializes a GraphSON collection to an object.
+        /// </summary>
+        /// <param name="graphSonData">The GraphSON collection to deserialize.</param>
+        /// <returns>The deserialized object.</returns>
+        public dynamic ToObject(IEnumerable<JToken> graphSonData)
+        {
+            return graphSonData.Select(graphson => ToObject(graphson));
+        }
+
+        /// <summary>
+        ///     Deserializes GraphSON to an object.
+        /// </summary>
+        /// <param name="jToken">The GraphSON to deserialize.</param>
+        /// <returns>The deserialized object.</returns>
+        public dynamic ToObject(JToken jToken)
+        {
+            if (jToken is JArray)
+                return jToken.Select(t => ToObject(t));
+            if (!jToken.HasValues) return ((JValue) jToken).Value;
+            if (!HasTypeKey(jToken)) return ReadDictionary(jToken);
+            return ReadTypedValue(jToken);
+        }
+
+        private bool HasTypeKey(JToken jToken)
+        {
+            var graphSONType = (string) jToken[GraphSONTokens.TypeKey];
+            return graphSONType != null;
+        }
+
+        private dynamic ReadTypedValue(JToken typedValue)
+        {
+            var graphSONType = (string) typedValue[GraphSONTokens.TypeKey];
+            return _deserializerByGraphSONType[graphSONType].Objectify(typedValue[GraphSONTokens.ValueKey], this);
+        }
+
+        private dynamic ReadDictionary(JToken jtokenDict)
+        {
+            var dict = new Dictionary<string, dynamic>();
+            foreach (var e in jtokenDict)
+            {
+                var property = e as JProperty;
+                if (property == null)
+                    throw new InvalidOperationException($"Cannot read graphson: {jtokenDict}");
+                dict.Add(property.Name, ToObject(property.Value));
+            }
+            return dict;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONTokens.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONTokens.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONTokens.cs
new file mode 100644
index 0000000..8beb850
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONTokens.cs
@@ -0,0 +1,32 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class GraphSONTokens
+    {
+        public static string TypeKey = "@type";
+        public static string ValueKey = "@value";
+        public static string GremlinTypeNamespace = "g";
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONUtil.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONUtil.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONUtil.cs
new file mode 100644
index 0000000..037839b
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONUtil.cs
@@ -0,0 +1,62 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    /// <summary>
+    ///     Provides helper methods for GraphSON serialization.
+    /// </summary>
+    public static class GraphSONUtil
+    {
+        /// <summary>
+        ///     Transforms a value intos its GraphSON representation including type information.
+        /// </summary>
+        /// <param name="typename">The name of the type.</param>
+        /// <param name="value">The value to transform.</param>
+        /// <param name="prefix">A namespace prefix for the typename.</param>
+        /// <returns>The GraphSON representation including type information.</returns>
+        public static Dictionary<string, dynamic> ToTypedValue(string typename, dynamic value, string prefix = "g")
+        {
+            var typedValue = new Dictionary<string, dynamic>
+            {
+                {GraphSONTokens.TypeKey, FormatTypeName(prefix, typename)}
+            };
+            if (value != null)
+                typedValue[GraphSONTokens.ValueKey] = value;
+            return typedValue;
+        }
+
+        /// <summary>
+        ///     Formats a type name with its prefix to a GraphSON TypeID.
+        /// </summary>
+        /// <param name="namespacePrefix">The namespace prefix (default is "g").</param>
+        /// <param name="typeName">The name of the type.</param>
+        /// <returns>The formatted TypeID.</returns>
+        public static string FormatTypeName(string namespacePrefix, string typeName)
+        {
+            return $"{namespacePrefix}:{typeName}";
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONWriter.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONWriter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONWriter.cs
new file mode 100644
index 0000000..ba632b1
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONWriter.cs
@@ -0,0 +1,146 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using Gremlin.Net.Driver.Messages;
+using Gremlin.Net.Process.Traversal;
+using Gremlin.Net.Process.Traversal.Strategy;
+using Newtonsoft.Json;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    /// <summary>
+    ///     Allows to serialize objects to GraphSON.
+    /// </summary>
+    public class GraphSONWriter
+    {
+        private readonly Dictionary<Type, IGraphSONSerializer> _serializerByType = new Dictionary
+            <Type, IGraphSONSerializer>
+            {
+                {typeof(ITraversal), new TraversalSerializer()},
+                {typeof(Bytecode), new BytecodeSerializer()},
+                {typeof(Binding), new BindingSerializer()},
+                {typeof(RequestMessage), new RequestMessageSerializer()},
+                {typeof(int), new Int32Converter()},
+                {typeof(long), new Int64Converter()},
+                {typeof(float), new FloatConverter()},
+                {typeof(double), new DoubleConverter()},
+                {typeof(Guid), new UuidSerializer()},
+                {typeof(DateTime), new DateSerializer()},
+                {typeof(Enum), new EnumSerializer()},
+                {typeof(TraversalPredicate), new TraversalPredicateSerializer()},
+                {typeof(Vertex), new VertexSerializer()},
+                {typeof(Edge), new EdgeSerializer()},
+                {typeof(Property), new PropertySerializer()},
+                {typeof(VertexProperty), new VertexPropertySerializer()},
+                {typeof(AbstractTraversalStrategy), new TraversalStrategySerializer()}
+            };
+
+        /// <summary>
+        ///     Initializes a new instance of the <see cref="GraphSONWriter" /> class.
+        /// </summary>
+        public GraphSONWriter()
+        {
+        }
+
+        /// <summary>
+        ///     Initializes a new instance of the <see cref="GraphSONWriter" /> class.
+        /// </summary>
+        /// <param name="customSerializerByType">
+        ///     <see cref="IGraphSONSerializer" /> serializers identified by their
+        ///     <see cref="Type" />.
+        /// </param>
+        public GraphSONWriter(IReadOnlyDictionary<Type, IGraphSONSerializer> customSerializerByType)
+        {
+            foreach (var serializerAndType in customSerializerByType)
+                _serializerByType[serializerAndType.Key] = serializerAndType.Value;
+        }
+
+        /// <summary>
+        ///     Serializes an object to GraphSON.
+        /// </summary>
+        /// <param name="objectData">The object to serialize.</param>
+        /// <returns>The serialized GraphSON.</returns>
+        public string WriteObject(dynamic objectData)
+        {
+            return JsonConvert.SerializeObject(ToDict(objectData));
+        }
+
+        internal dynamic ToDict(dynamic objectData)
+        {
+            var type = objectData.GetType();
+            if (TryGetSerializerFor(out IGraphSONSerializer serializer, type))
+                return serializer.Dictify(objectData, this);
+            if (IsDictionaryType(type))
+                return DictToGraphSONDict(objectData);
+            if (IsCollectionType(type))
+                return CollectionToGraphSONCollection(objectData);
+            return objectData;
+        }
+
+        private bool TryGetSerializerFor(out IGraphSONSerializer serializer, Type type)
+        {
+            if (_serializerByType.ContainsKey(type))
+            {
+                serializer = _serializerByType[type];
+                return true;
+            }
+            foreach (var supportedType in _serializerByType.Keys)
+                if (supportedType.IsAssignableFrom(type))
+                {
+                    serializer = _serializerByType[supportedType];
+                    return true;
+                }
+            serializer = null;
+            return false;
+        }
+
+        private bool IsDictionaryType(Type type)
+        {
+            return type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>);
+        }
+
+        private Dictionary<string, dynamic> DictToGraphSONDict(dynamic dict)
+        {
+            var graphSONDict = new Dictionary<string, dynamic>();
+            foreach (var keyValue in dict)
+                graphSONDict.Add(ToDict(keyValue.Key), ToDict(keyValue.Value));
+            return graphSONDict;
+        }
+
+        private bool IsCollectionType(Type type)
+        {
+            return type.GetInterfaces().Contains(typeof(ICollection));
+        }
+
+        private IEnumerable<dynamic> CollectionToGraphSONCollection(dynamic collection)
+        {
+            foreach (var e in collection)
+                yield return ToDict(e);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONDeserializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONDeserializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONDeserializer.cs
new file mode 100644
index 0000000..b15b169
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONDeserializer.cs
@@ -0,0 +1,41 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    /// <summary>
+    ///     Supports deserializing GraphSON into an object.
+    /// </summary>
+    public interface IGraphSONDeserializer
+    {
+        /// <summary>
+        ///     Deserializes GraphSON to an object.
+        /// </summary>
+        /// <param name="graphsonObject">The GraphSON object to objectify.</param>
+        /// <param name="reader">A <see cref="GraphSONReader" /> that can be used to objectify properties of the GraphSON object.</param>
+        /// <returns>The deserialized object.</returns>
+        dynamic Objectify(JToken graphsonObject, GraphSONReader reader);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONSerializer.cs
new file mode 100644
index 0000000..f5faf84
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/IGraphSONSerializer.cs
@@ -0,0 +1,41 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    /// <summary>
+    ///     Supports serializing of an object to GraphSON.
+    /// </summary>
+    public interface IGraphSONSerializer
+    {
+        /// <summary>
+        ///     Transforms an object into a dictionary that resembles its GraphSON representation.
+        /// </summary>
+        /// <param name="objectData">The object to dictify.</param>
+        /// <param name="writer">A <see cref="GraphSONWriter" /> that can be used to dictify properties of the object.</param>
+        /// <returns>The GraphSON representation.</returns>
+        Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int32Converter.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int32Converter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int32Converter.cs
new file mode 100644
index 0000000..052f938
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int32Converter.cs
@@ -0,0 +1,33 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class Int32Converter : NumberConverter
+    {
+        protected override string GraphSONTypeName => "Int32";
+        protected override Type HandledType => typeof(int);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int64Converter.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int64Converter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int64Converter.cs
new file mode 100644
index 0000000..dd0160f
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/Int64Converter.cs
@@ -0,0 +1,33 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class Int64Converter : NumberConverter
+    {
+        protected override string GraphSONTypeName => "Int64";
+        protected override Type HandledType => typeof(long);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/NumberConverter.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/NumberConverter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/NumberConverter.cs
new file mode 100644
index 0000000..579d202
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/NumberConverter.cs
@@ -0,0 +1,45 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal abstract class NumberConverter : IGraphSONDeserializer, IGraphSONSerializer
+    {
+        protected abstract string GraphSONTypeName { get; }
+        protected abstract Type HandledType { get; }
+
+        public dynamic Objectify(JToken graphsonObject, GraphSONReader reader)
+        {
+            return graphsonObject.ToObject(HandledType);
+        }
+
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            return GraphSONUtil.ToTypedValue(GraphSONTypeName, objectData);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PathDeserializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PathDeserializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PathDeserializer.cs
new file mode 100644
index 0000000..afdf07c
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PathDeserializer.cs
@@ -0,0 +1,41 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Linq;
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class PathDeserializer : IGraphSONDeserializer
+    {
+        public dynamic Objectify(JToken graphsonObject, GraphSONReader reader)
+        {
+            var labels =
+                graphsonObject["labels"]
+                    .Select(readObjLabels => readObjLabels.Select(l => (string) l).ToList())
+                    .ToList();
+            var objects = graphsonObject["objects"].Select(o => reader.ToObject(o)).ToList();
+            return new Path(labels, objects);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertyDeserializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertyDeserializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertyDeserializer.cs
new file mode 100644
index 0000000..11f160e
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertyDeserializer.cs
@@ -0,0 +1,38 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using Newtonsoft.Json.Linq;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class PropertyDeserializer : IGraphSONDeserializer
+    {
+        public dynamic Objectify(JToken graphsonObject, GraphSONReader reader)
+        {
+            var key = (string) graphsonObject["key"];
+            var value = reader.ToObject(graphsonObject["value"]);
+            var element = graphsonObject["element"] != null ? reader.ToObject(graphsonObject["element"]) : null;
+            return new Property(key, value, element);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertySerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertySerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertySerializer.cs
new file mode 100644
index 0000000..0a7e6f8
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/PropertySerializer.cs
@@ -0,0 +1,64 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class PropertySerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            Property property = objectData;
+            var elementDict = CreateElementDict(property.Element, writer);
+            var valueDict = new Dictionary<string, dynamic>
+            {
+                {"key", property.Key},
+                {"value", writer.ToDict(property.Value)},
+                {"element", elementDict}
+            };
+            return GraphSONUtil.ToTypedValue(nameof(Property), valueDict);
+        }
+
+        private dynamic CreateElementDict(Element element, GraphSONWriter writer)
+        {
+            if (element == null)
+                return null;
+            var serializedElement = writer.ToDict(element);
+            Dictionary<string, dynamic> elementDict = serializedElement;
+            if (elementDict.ContainsKey(GraphSONTokens.ValueKey))
+            {
+                var elementValueSerialized = elementDict[GraphSONTokens.ValueKey];
+                Dictionary<string, dynamic> elementValueDict = elementValueSerialized;
+                if (elementValueDict != null)
+                {
+                    elementValueDict.Remove("outVLabel");
+                    elementValueDict.Remove("inVLabel");
+                    elementValueDict.Remove("properties");
+                    elementValueDict.Remove("value");
+                }
+            }
+            return serializedElement;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs
new file mode 100644
index 0000000..b796423
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs
@@ -0,0 +1,43 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using Gremlin.Net.Driver.Messages;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class RequestMessageSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+        {
+            RequestMessage msg = objectData;
+            return new Dictionary<string, dynamic>
+            {
+                {"requestId", writer.ToDict(msg.RequestId)},
+                {"op", msg.Operation},
+                {"processor", msg.Processor},
+                {"args", writer.ToDict(msg.Arguments)}
+            };
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/TraversalPredicateSerializer.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/TraversalPredicateSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/TraversalPredicateSerializer.cs
new file mode 100644
index 0000000..937cb90
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/TraversalPredicateSerializer.cs
@@ -0,0 +1,45 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.Net.Structure.IO.GraphSON
+{
+    internal class TraversalPredicateSerializer : IGraphSONSerializer
+    {
+        public Dictionary<string, dynamic> Dictify(dynamic predicate, GraphSONWriter writer)
+        {
+            TraversalPredicate p = predicate;
+            var value = p.Other == null
+                ? writer.ToDict(p.Value)
+                : new List<dynamic> {writer.ToDict(p.Value), writer.ToDict(p.Other)};
+            var dict = new Dictionary<string, dynamic>
+            {
+                {"predicate", p.OperatorName},
+                {"value", value}
+            };
+            return GraphSONUtil.ToTypedValue("P", dict);
+        }
+    }
+}
\ No newline at end of file