diff --git a/External/KdTree/KdTreeLib/KdTree.cs b/External/KdTree/KdTreeLib/KdTree.cs index 96cf75ea6..59e665bcc 100644 --- a/External/KdTree/KdTreeLib/KdTree.cs +++ b/External/KdTree/KdTreeLib/KdTree.cs @@ -3,8 +3,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization.Formatters.Binary; +using System.Runtime.Serialization; using System.Text; +using System.Xml; namespace UnityEngine.ProBuilder.KdTree { @@ -25,6 +26,7 @@ public DuplicateNodeError() } [Serializable] + [DataContract] class KdTree : IKdTree { public KdTree(int dimensions, ITypeMath typeMath) @@ -40,12 +42,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 +376,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 +585,22 @@ public void Clear() public void SaveToFile(string filename) { - BinaryFormatter formatter = new BinaryFormatter(); + var serializer = new DataContractSerializer(typeof(KdTree)); using (FileStream stream = File.Create(filename)) + using (var writer = XmlDictionaryWriter.CreateBinaryWriter(stream)) { - formatter.Serialize(stream, this); - stream.Flush(); + serializer.WriteObject(writer, this); + writer.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)) + using (var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max)) { - return (KdTree)formatter.Deserialize(stream); + return (KdTree)serializer.ReadObject(reader); } } 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]