diff --git a/src/KubernetesClient/KubernetesYaml.cs b/src/KubernetesClient/KubernetesYaml.cs index b40ed8d44..803c2bb64 100644 --- a/src/KubernetesClient/KubernetesYaml.cs +++ b/src/KubernetesClient/KubernetesYaml.cs @@ -12,6 +12,9 @@ namespace k8s /// </summary> public static class KubernetesYaml { + private static readonly object DeserializerLockObject = new object(); + private static readonly object SerializerLockObject = new object(); + private static DeserializerBuilder CommonDeserializerBuilder => new DeserializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) @@ -156,8 +159,11 @@ public static List<object> LoadAllFromString(string content, IDictionary<string, parser.Consume<StreamStart>(); while (parser.Accept<DocumentStart>(out _)) { - var dict = GetDeserializer(strict).Deserialize<Dictionary<object, object>>(parser); - types.Add(mergedTypeMap[dict["apiVersion"] + "/" + dict["kind"]]); + lock (DeserializerLockObject) + { + var dict = GetDeserializer(strict).Deserialize<Dictionary<object, object>>(parser); + types.Add(mergedTypeMap[dict["apiVersion"] + "/" + dict["kind"]]); + } } parser = new MergingParser(new Parser(new StringReader(content))); @@ -167,8 +173,11 @@ public static List<object> LoadAllFromString(string content, IDictionary<string, while (parser.Accept<DocumentStart>(out _)) { var objType = types[ix++]; - var obj = GetDeserializer(strict).Deserialize(parser, objType); - results.Add(obj); + lock (DeserializerLockObject) + { + var obj = GetDeserializer(strict).Deserialize(parser, objType); + results.Add(obj); + } } return results; @@ -204,13 +213,19 @@ public static string SaveToString<T>(T value) public static TValue Deserialize<TValue>(string yaml, bool strict = false) { using var reader = new StringReader(yaml); - return GetDeserializer(strict).Deserialize<TValue>(new MergingParser(new Parser(reader))); + lock (DeserializerLockObject) + { + return GetDeserializer(strict).Deserialize<TValue>(new MergingParser(new Parser(reader))); + } } public static TValue Deserialize<TValue>(Stream yaml, bool strict = false) { using var reader = new StreamReader(yaml); - return GetDeserializer(strict).Deserialize<TValue>(new MergingParser(new Parser(reader))); + lock (DeserializerLockObject) + { + return GetDeserializer(strict).Deserialize<TValue>(new MergingParser(new Parser(reader))); + } } public static string SerializeAll(IEnumerable<object> values) @@ -231,7 +246,11 @@ public static string SerializeAll(IEnumerable<object> values) if (value != null) { emitter.Emit(new DocumentStart()); - Serializer.SerializeValue(emitter, value, value.GetType()); + lock (SerializerLockObject) + { + Serializer.SerializeValue(emitter, value, value.GetType()); + } + emitter.Emit(new DocumentEnd(true)); } } @@ -252,7 +271,10 @@ public static string Serialize(object value) emitter.Emit(new StreamStart()); emitter.Emit(new DocumentStart()); - Serializer.SerializeValue(emitter, value, value.GetType()); + lock (SerializerLockObject) + { + Serializer.SerializeValue(emitter, value, value.GetType()); + } return stringBuilder.ToString(); }