diff --git a/src/GraphQL.Client.Abstractions.Websocket/GraphQLWebSocketRequest.cs b/src/GraphQL.Client.Abstractions.Websocket/GraphQLWebSocketRequest.cs
index 0f486482..a44e57d6 100644
--- a/src/GraphQL.Client.Abstractions.Websocket/GraphQLWebSocketRequest.cs
+++ b/src/GraphQL.Client.Abstractions.Websocket/GraphQLWebSocketRequest.cs
@@ -8,7 +8,7 @@ namespace GraphQL.Client.Abstractions.Websocket {
///
/// A Subscription Request
///
- public class GraphQLWebSocketRequest : IEquatable {
+ public class GraphQLWebSocketRequest : Dictionary, IEquatable {
public const string IdKey = "id";
public const string TypeKey = "type";
public const string PayloadKey = "payload";
@@ -16,20 +16,26 @@ public class GraphQLWebSocketRequest : IEquatable {
///
/// The Identifier of the Response
///
- [DataMember(Name = IdKey)]
- public virtual string Id { get; set; }
+ public string Id {
+ get => ContainsKey(IdKey) ? (string)this[IdKey] : null;
+ set => this[IdKey] = value;
+ }
///
/// The Type of the Request
///
- [DataMember(Name = TypeKey)]
- public virtual string Type { get; set; }
+ public string Type {
+ get => ContainsKey(TypeKey) ? (string)this[TypeKey] : null;
+ set => this[TypeKey] = value;
+ }
///
/// The payload of the websocket request
///
- [DataMember(Name = PayloadKey)]
- public virtual GraphQLRequest Payload { get; set; }
+ public GraphQLRequest Payload {
+ get => ContainsKey(PayloadKey) ? (GraphQLRequest) this[PayloadKey] : null;
+ set => this[PayloadKey] = value;
+ }
private TaskCompletionSource _tcs = new TaskCompletionSource();
diff --git a/src/GraphQL.Client.Serializer.Newtonsoft/GraphQLRequest.cs b/src/GraphQL.Client.Serializer.Newtonsoft/GraphQLRequest.cs
deleted file mode 100644
index cf012c92..00000000
--- a/src/GraphQL.Client.Serializer.Newtonsoft/GraphQLRequest.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using Newtonsoft.Json;
-
-namespace GraphQL.Client.Serializer.Newtonsoft {
- public class GraphQLRequest: GraphQL.GraphQLRequest {
- [JsonProperty(QueryKey)]
- public override string Query { get; set; }
- [JsonProperty(OperationNameKey)]
- public override string? OperationName { get; set; }
- [JsonProperty(VariablesKey)]
- public override object? Variables { get; set; }
-
- public GraphQLRequest() { }
-
- public GraphQLRequest(GraphQL.GraphQLRequest other) {
- Query = other.Query;
- OperationName = other.OperationName;
- Variables = other.Variables;
- }
-
- }
-}
diff --git a/src/GraphQL.Client.Serializer.Newtonsoft/GraphQLWebSocketRequest.cs b/src/GraphQL.Client.Serializer.Newtonsoft/GraphQLWebSocketRequest.cs
deleted file mode 100644
index c575b9d3..00000000
--- a/src/GraphQL.Client.Serializer.Newtonsoft/GraphQLWebSocketRequest.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Newtonsoft.Json;
-
-namespace GraphQL.Client.Serializer.Newtonsoft {
- public class GraphQLWebSocketRequest: Abstractions.Websocket.GraphQLWebSocketRequest {
-
- [JsonProperty(IdKey)]
- public override string Id { get; set; }
- [JsonProperty(TypeKey)]
- public override string Type { get; set; }
- [JsonProperty(PayloadKey)]
- public override GraphQL.GraphQLRequest Payload { get; set; }
-
- public GraphQLWebSocketRequest()
- {
- }
-
- public GraphQLWebSocketRequest(Abstractions.Websocket.GraphQLWebSocketRequest other) {
- Id = other.Id;
- Type = other.Type;
- Payload = other.Payload != null ? new GraphQLRequest(other.Payload) : null; // create serializer-specific type
- }
- }
-}
diff --git a/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs b/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs
index 7194a547..67679432 100644
--- a/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs
+++ b/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs
@@ -34,11 +34,11 @@ private void ConfigureMandatorySerializerOptions() {
}
public string SerializeToString(GraphQL.GraphQLRequest request) {
- return JsonConvert.SerializeObject(new GraphQLRequest(request), JsonSerializerSettings);
+ return JsonConvert.SerializeObject(request, JsonSerializerSettings);
}
public byte[] SerializeToBytes(Abstractions.Websocket.GraphQLWebSocketRequest request) {
- var json = JsonConvert.SerializeObject(new GraphQLWebSocketRequest(request), JsonSerializerSettings);
+ var json = JsonConvert.SerializeObject(request, JsonSerializerSettings);
return Encoding.UTF8.GetBytes(json);
}
diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj b/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj
index 024b0681..8f8bc66a 100644
--- a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj
+++ b/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj
@@ -10,10 +10,6 @@
-
-
-
-
diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQLRequest.cs b/src/GraphQL.Client.Serializer.SystemTextJson/GraphQLRequest.cs
deleted file mode 100644
index 1f3b7908..00000000
--- a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQLRequest.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System.Text.Json.Serialization;
-
-namespace GraphQL.Client.Serializer.SystemTextJson {
- public class GraphQLRequest: GraphQL.GraphQLRequest {
- [JsonPropertyName(QueryKey)]
- public override string Query { get; set; }
- [JsonPropertyName(OperationNameKey)]
- public override string? OperationName { get; set; }
- [JsonPropertyName(VariablesKey)]
- public override object? Variables { get; set; }
-
- public GraphQLRequest() { }
-
- public GraphQLRequest(GraphQL.GraphQLRequest other) {
- Query = other.Query;
- OperationName = other.OperationName;
- Variables = other.Variables;
- }
-
- }
-}
diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQLWebSocketRequest.cs b/src/GraphQL.Client.Serializer.SystemTextJson/GraphQLWebSocketRequest.cs
deleted file mode 100644
index 4961e00d..00000000
--- a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQLWebSocketRequest.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System.Text.Json.Serialization;
-
-namespace GraphQL.Client.Serializer.SystemTextJson {
- public class GraphQLWebSocketRequest: Abstractions.Websocket.GraphQLWebSocketRequest {
-
- [JsonPropertyName(IdKey)]
- public override string Id { get; set; }
- [JsonPropertyName(TypeKey)]
- public override string Type { get; set; }
- [JsonPropertyName(PayloadKey)]
- public override GraphQL.GraphQLRequest Payload { get; set; }
-
- public GraphQLWebSocketRequest()
- {
- }
-
- public GraphQLWebSocketRequest(Abstractions.Websocket.GraphQLWebSocketRequest other) {
- Id = other.Id;
- Type = other.Type;
- Payload = other.Payload != null ? new GraphQLRequest(other.Payload) : null; // create serializer-specific type;
- }
- }
-}
diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/ImmutableConverter.cs b/src/GraphQL.Client.Serializer.SystemTextJson/ImmutableConverter.cs
new file mode 100644
index 00000000..a4f49f49
--- /dev/null
+++ b/src/GraphQL.Client.Serializer.SystemTextJson/ImmutableConverter.cs
@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace GraphQL.Client.Serializer.SystemTextJson {
+
+ ///
+ /// class for converting immutable objects, derived from https://github.com/manne/obviously/blob/master/src/system.text.json/Core/ImmutableConverter.cs
+ ///
+ public class ImmutableConverter : JsonConverter