From f5000e9f3caae4fffcf587dccf1e6ca0c088896f Mon Sep 17 00:00:00 2001 From: Miro Brodlova Date: Thu, 27 Nov 2025 12:48:01 +0100 Subject: [PATCH] Replace BinaryFormatter with DataContractSerializer BinaryFormatter is deprecated in future .NET versions and may prevent assemblies from unloading or return incorrect results. Replaced with System.Runtime.Serialization.DataContractSerializer as recommended for compatibility. Changes: - KdTree.cs: Replaced BinaryFormatter with DataContractSerializer in SaveToFile and LoadFromFile methods - KdTreeNode.cs: Added DataContract and DataMember attributes - Added [DataContract] and [DataMember] attributes to all serialized classes Related to SCP-1555 --- External/KdTree/KdTreeLib/KdTree.cs | 18 ++++++++++++------ External/KdTree/KdTreeLib/KdTreeNode.cs | 7 +++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/External/KdTree/KdTreeLib/KdTree.cs b/External/KdTree/KdTreeLib/KdTree.cs index 96cf75ea6..32c7d79b6 100644 --- a/External/KdTree/KdTreeLib/KdTree.cs +++ b/External/KdTree/KdTreeLib/KdTree.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization.Formatters.Binary; +using System.Runtime.Serialization; using System.Text; namespace UnityEngine.ProBuilder.KdTree @@ -25,6 +25,7 @@ public DuplicateNodeError() } [Serializable] + [DataContract] class KdTree : IKdTree { public KdTree(int dimensions, ITypeMath typeMath) @@ -40,12 +41,16 @@ public KdTree(int dimensions, ITypeMath typeMath, AddDuplicateBehavior add AddDuplicateBehavior = addDuplicateBehavior; } + [DataMember] private int dimensions; + [DataMember] private ITypeMath typeMath = null; + [DataMember] private KdTreeNode root = null; + [DataMember] public AddDuplicateBehavior AddDuplicateBehavior { get; private set; } public bool Add(TKey[] point, TValue value) @@ -370,7 +375,8 @@ public KdTreeNode[] RadialSearch(TKey[] center, TKey radius, int c return neighbourArray; } - public int Count { get; private set; } + [DataMember] + public int Count { get; private set; } public bool TryFindValueAt(TKey[] point, out TValue value) { @@ -578,20 +584,20 @@ public void Clear() public void SaveToFile(string filename) { - BinaryFormatter formatter = new BinaryFormatter(); + var serializer = new DataContractSerializer(typeof(KdTree)); using (FileStream stream = File.Create(filename)) { - formatter.Serialize(stream, this); + serializer.WriteObject(stream, this); stream.Flush(); } } public static KdTree LoadFromFile(string filename) { - BinaryFormatter formatter = new BinaryFormatter(); + var serializer = new DataContractSerializer(typeof(KdTree)); using (FileStream stream = File.Open(filename, FileMode.Open)) { - return (KdTree)formatter.Deserialize(stream); + return (KdTree)serializer.ReadObject(stream); } } diff --git a/External/KdTree/KdTreeLib/KdTreeNode.cs b/External/KdTree/KdTreeLib/KdTreeNode.cs index 41adac572..35672ddd7 100644 --- a/External/KdTree/KdTreeLib/KdTreeNode.cs +++ b/External/KdTree/KdTreeLib/KdTreeNode.cs @@ -2,10 +2,12 @@ using System.Text; using System.Linq; using System.Collections.Generic; +using System.Runtime.Serialization; namespace UnityEngine.ProBuilder.KdTree { [Serializable] + [DataContract] class KdTreeNode { public KdTreeNode() @@ -18,11 +20,16 @@ public KdTreeNode(TKey[] point, TValue value) Value = value; } + [DataMember] public TKey[] Point; + [DataMember] public TValue Value = default(TValue); + [DataMember] public List Duplicates = null; + [DataMember] internal KdTreeNode LeftChild = null; + [DataMember] internal KdTreeNode RightChild = null; internal KdTreeNode this[int compare]