diff --git a/plist-cil.test/BinaryPropertyListWriterTests.cs b/plist-cil.test/BinaryPropertyListWriterTests.cs index 8b966aa..3433949 100644 --- a/plist-cil.test/BinaryPropertyListWriterTests.cs +++ b/plist-cil.test/BinaryPropertyListWriterTests.cs @@ -21,5 +21,21 @@ namespace plistcil.test writer.Write(root); } } + + [Fact] + public void Roundtrip2Test() + { + byte[] data = File.ReadAllBytes("test-files/plist2.bin"); + NSObject root = PropertyListParser.Parse(data); + + using (MemoryStream actualOutput = new MemoryStream()) + using (Stream expectedOutput = File.OpenRead("test-files/plist2.bin")) + using (ValidatingStream validatingStream = new ValidatingStream(actualOutput, expectedOutput)) + { + BinaryPropertyListWriter writer = new BinaryPropertyListWriter(validatingStream); + writer.ReuseObjectIds = false; + writer.Write(root); + } + } } } diff --git a/plist-cil.test/plist-cil.test.csproj b/plist-cil.test/plist-cil.test.csproj index 60093e4..c7698c2 100644 --- a/plist-cil.test/plist-cil.test.csproj +++ b/plist-cil.test/plist-cil.test.csproj @@ -116,6 +116,9 @@ + + PreserveNewest + PreserveNewest diff --git a/plist-cil.test/test-files/plist2.bin b/plist-cil.test/test-files/plist2.bin new file mode 100644 index 0000000..cae641d Binary files /dev/null and b/plist-cil.test/test-files/plist2.bin differ diff --git a/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs b/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs index afc7323..9f3eb54 100644 --- a/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs +++ b/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs @@ -25,6 +25,10 @@ namespace Claunia.PropertyList { return x.Equals(y); } + else if (x is NSNumber && BinaryPropertyListWriter.IsSerializationPrimitive((NSNumber)x)) + { + return x.Equals(y); + } else if (x is NSString && BinaryPropertyListWriter.IsSerializationPrimitive((NSString)x)) { return x.Equals(y); @@ -48,6 +52,12 @@ namespace Claunia.PropertyList return u.GetHashCode(); } + var n = obj as NSNumber; + if (n != null && BinaryPropertyListWriter.IsSerializationPrimitive(n)) + { + return n.ToObject().GetHashCode(); + } + var s = obj as NSString; if (s != null && BinaryPropertyListWriter.IsSerializationPrimitive(s)) { diff --git a/plist-cil/BinaryPropertyListWriter.cs b/plist-cil/BinaryPropertyListWriter.cs index 919f921..1c7641d 100644 --- a/plist-cil/BinaryPropertyListWriter.cs +++ b/plist-cil/BinaryPropertyListWriter.cs @@ -240,7 +240,7 @@ namespace Claunia.PropertyList long[] offsets = new long[idDict.Count]; // write each object, save offset - foreach(var pair in idDict) + foreach (var pair in idDict) { NSObject obj = pair.Key; int id = pair.Value; @@ -422,11 +422,18 @@ namespace Claunia.PropertyList || content == "$classname" || content == "NS.objects" || content == "NS.keys" + || content == "NSURL" || content == "NSDictionary" || content == "NSObject" || content == "NSMutableDictionary" || content == "NSMutableArray" - || content == "NSArray"; + || content == "NSArray" + || content == "NSUUID"; + } + + internal static bool IsSerializationPrimitive(NSNumber n) + { + return n.isBoolean(); } } } diff --git a/plist-cil/UID.cs b/plist-cil/UID.cs index 3263995..3dd1a8e 100644 --- a/plist-cil/UID.cs +++ b/plist-cil/UID.cs @@ -338,6 +338,12 @@ namespace Claunia.PropertyList { return this.value.GetHashCode(); } + + /// + public override string ToString() + { + return $"{this.value} (UID)"; + } } }