diff --git a/src/KubeUI/Utilities.cs b/src/KubeUI/Utilities.cs index 72501a17..6d873cb2 100644 --- a/src/KubeUI/Utilities.cs +++ b/src/KubeUI/Utilities.cs @@ -1,6 +1,9 @@ using Avalonia.Data.Converters; +using k8s; using k8s.Models; +using System.Reflection; using System.Runtime.CompilerServices; +using System.Text.Json; namespace KubeUI; @@ -244,4 +247,20 @@ public static string GetKubeAssetPath(Type type) return "/Assets/kube/blank.svg"; } + + public static IKubernetesObject CloneObject(object obj) + { + var json = KubernetesJson.Serialize(obj); + + return (IKubernetesObject)DeserializeKubeJson(json, obj.GetType()); + } + + private static readonly MethodInfo _deserializeJson = typeof(KubernetesJson).GetMethod(nameof(KubernetesJson.Deserialize), BindingFlags.Static | BindingFlags.Public, [typeof(string), typeof(JsonSerializerOptions)]); + + public static object DeserializeKubeJson(string json, Type type) + { + var fooRef = _deserializeJson.MakeGenericMethod(type); + + return fooRef.Invoke(null, [json, null]); + } } diff --git a/src/KubeUI/ViewModels/ResourceYamlViewModel.cs b/src/KubeUI/ViewModels/ResourceYamlViewModel.cs index 9a3b47d4..e3c06f7a 100644 --- a/src/KubeUI/ViewModels/ResourceYamlViewModel.cs +++ b/src/KubeUI/ViewModels/ResourceYamlViewModel.cs @@ -40,7 +40,7 @@ private void SetYamlDocument() { if (!EditMode && HideNoisyFields) { - var ObjectClone = CloneObject(Object); + var ObjectClone = Utilities.CloneObject(Object); if (ObjectClone.Metadata != null) { @@ -119,13 +119,6 @@ private bool CanSetEditMode() return true; } - public IKubernetesObject CloneObject(object obj) - { - var source = Client.Serialization.KubernetesYaml.Serialize(obj); - - return (IKubernetesObject)Client.Serialization.KubernetesYaml.Deserializer.Deserialize(source, obj.GetType())!; - } - public void Dispose() { if (Cluster != null)