diff --git a/OpenMetaverse.StructuredData/JSON/OSDJson.cs b/OpenMetaverse.StructuredData/JSON/OSDJson.cs index 8761c92a..11616e10 100644 --- a/OpenMetaverse.StructuredData/JSON/OSDJson.cs +++ b/OpenMetaverse.StructuredData/JSON/OSDJson.cs @@ -62,15 +62,20 @@ namespace OpenMetaverse.StructuredData public static string SerializeJsonString(OSD osd) { - return SerializeJson(osd).ToJson(); + return SerializeJson(osd, false).ToJson(); } - public static void SerializeJsonString(OSD osd, ref JsonWriter writer) + public static string SerializeJsonString(OSD osd, bool preserveDefaults) { - SerializeJson(osd).ToJson(writer); + return SerializeJson(osd, preserveDefaults).ToJson(); } - public static JsonData SerializeJson(OSD osd) + public static void SerializeJsonString(OSD osd, bool preserveDefaults, ref JsonWriter writer) + { + SerializeJson(osd, preserveDefaults).ToJson(writer); + } + + public static JsonData SerializeJson(OSD osd, bool preserveDefaults) { switch (osd.Type) { @@ -97,7 +102,7 @@ namespace OpenMetaverse.StructuredData jsonarray.SetJsonType(JsonType.Array); OSDArray array = (OSDArray)osd; for (int i = 0; i < array.Count; i++) - jsonarray.Add(SerializeJson(array[i])); + jsonarray.Add(SerializeJson(array[i], preserveDefaults)); return jsonarray; case OSDType.Map: JsonData jsonmap = new JsonData(); @@ -105,8 +110,13 @@ namespace OpenMetaverse.StructuredData OSDMap map = (OSDMap)osd; foreach (KeyValuePair kvp in map) { - // Default values will not be serialized to the jsonmap - JsonData data = SerializeJsonNoDefaults(kvp.Value); + JsonData data; + + if (preserveDefaults) + data = SerializeJson(kvp.Value, preserveDefaults); + else + data = SerializeJsonNoDefaults(kvp.Value); + if (data != null) jsonmap[kvp.Key] = data; } @@ -168,7 +178,7 @@ namespace OpenMetaverse.StructuredData jsonarray.SetJsonType(JsonType.Array); OSDArray array = (OSDArray)osd; for (int i = 0; i < array.Count; i++) - jsonarray.Add(SerializeJson(array[i])); + jsonarray.Add(SerializeJson(array[i], false)); return jsonarray; case OSDType.Map: JsonData jsonmap = new JsonData(); diff --git a/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs b/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs index c340f8e6..a3a17fff 100644 --- a/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs +++ b/OpenMetaverse.StructuredData/LLSD/BinaryLLSD.cs @@ -53,7 +53,7 @@ namespace OpenMetaverse.StructuredData private const int int32Length = 4; private const int doubleLength = 8; - private static byte[] llsdBinaryHead = Encoding.ASCII.GetBytes("\n"); + private const string llsdBinaryHead = "\n"; private const byte undefBinaryValue = (byte)'!'; private const byte trueBinaryValue = (byte)'1'; private const byte falseBinaryValue = (byte)'0'; @@ -70,6 +70,8 @@ namespace OpenMetaverse.StructuredData private const byte mapEndBinaryMarker = (byte)'}'; private const byte keyBinaryMarker = (byte)'k'; + private static readonly byte[] llsdBinaryHeadBytes = Encoding.ASCII.GetBytes(llsdBinaryHead); + /// /// /// @@ -96,7 +98,7 @@ namespace OpenMetaverse.StructuredData SkipWhiteSpace(stream); - bool result = FindByteArray(stream, llsdBinaryHead); + bool result = FindString(stream, llsdBinaryHead); if (!result) throw new OSDException("Failed to decode binary LLSD"); @@ -127,7 +129,7 @@ namespace OpenMetaverse.StructuredData { MemoryStream stream = new MemoryStream(initialBufferSize); - stream.Write(llsdBinaryHead, 0, llsdBinaryHead.Length); + stream.Write(llsdBinaryHeadBytes, 0, llsdBinaryHeadBytes.Length); SerializeLLSDBinaryElement(stream, data); return stream; } @@ -376,7 +378,7 @@ namespace OpenMetaverse.StructuredData /// /// /// - public static bool FindByteArray(Stream stream, byte[] toFind) + public static bool FindString(Stream stream, string toFind) { int lastIndexToFind = toFind.Length - 1; int crrIndex = 0; @@ -389,7 +391,7 @@ namespace OpenMetaverse.StructuredData (crrIndex <= lastIndexToFind) ) { - if (toFind[crrIndex] == (byte)bt) + if (toFind[crrIndex].ToString().Equals(((char)bt).ToString(), StringComparison.InvariantCultureIgnoreCase)) { found = true; crrIndex++; diff --git a/OpenMetaverse.StructuredData/StructuredData.cs b/OpenMetaverse.StructuredData/StructuredData.cs index b29b93b0..fda3b55f 100644 --- a/OpenMetaverse.StructuredData/StructuredData.cs +++ b/OpenMetaverse.StructuredData/StructuredData.cs @@ -803,7 +803,7 @@ namespace OpenMetaverse.StructuredData public override string ToString() { - return OSDParser.SerializeJsonString(this); + return OSDParser.SerializeJsonString(this, true); } #region IDictionary Implementation @@ -1035,7 +1035,7 @@ namespace OpenMetaverse.StructuredData public override string ToString() { - return OSDParser.SerializeJsonString(this); + return OSDParser.SerializeJsonString(this, true); } #region IList Implementation @@ -1120,31 +1120,47 @@ namespace OpenMetaverse.StructuredData public partial class OSDParser { - const string LLSD_BINARY_HEADER = ""; + const string LLSD_BINARY_HEADER = ""; const string LLSD_XML_HEADER = ""; const string LLSD_XML_ALT_HEADER = ""; + const string LLSD_XML_ALT2_HEADER = ""; public static OSD Deserialize(byte[] data) { - string header = Encoding.ASCII.GetString(data, 0, data.Length >= 14 ? 14 : data.Length); + string header = Encoding.ASCII.GetString(data, 0, data.Length >= 17 ? 17 : data.Length); - if (header.StartsWith(LLSD_BINARY_HEADER)) + if (header.StartsWith(LLSD_BINARY_HEADER, StringComparison.InvariantCultureIgnoreCase)) + { return DeserializeLLSDBinary(data); - else if (header.StartsWith(LLSD_XML_HEADER) || header.StartsWith(LLSD_XML_ALT_HEADER) || header.StartsWith(LLSD_XML_ALT2_HEADER)) + } + else if (header.StartsWith(LLSD_XML_HEADER, StringComparison.InvariantCultureIgnoreCase) || + header.StartsWith(LLSD_XML_ALT_HEADER, StringComparison.InvariantCultureIgnoreCase) || + header.StartsWith(LLSD_XML_ALT2_HEADER, StringComparison.InvariantCultureIgnoreCase)) + { return DeserializeLLSDXml(data); + } else + { return DeserializeJson(Encoding.UTF8.GetString(data)); + } } public static OSD Deserialize(string data) { - if (data.StartsWith(LLSD_BINARY_HEADER)) + if (data.StartsWith(LLSD_BINARY_HEADER, StringComparison.InvariantCultureIgnoreCase)) + { return DeserializeLLSDBinary(Encoding.UTF8.GetBytes(data)); - else if (data.StartsWith(LLSD_XML_HEADER) || data.StartsWith(LLSD_XML_ALT_HEADER) || data.StartsWith(LLSD_XML_ALT2_HEADER)) + } + else if (data.StartsWith(LLSD_XML_HEADER, StringComparison.InvariantCultureIgnoreCase) || + data.StartsWith(LLSD_XML_ALT_HEADER, StringComparison.InvariantCultureIgnoreCase) || + data.StartsWith(LLSD_XML_ALT2_HEADER, StringComparison.InvariantCultureIgnoreCase)) + { return DeserializeLLSDXml(data); + } else + { return DeserializeJson(data); + } } public static OSD Deserialize(Stream stream) diff --git a/OpenMetaverse.Tests/BinaryLLSDTests.cs b/OpenMetaverse.Tests/BinaryLLSDTests.cs index ebea3543..59db9091 100644 --- a/OpenMetaverse.Tests/BinaryLLSDTests.cs +++ b/OpenMetaverse.Tests/BinaryLLSDTests.cs @@ -58,27 +58,23 @@ namespace OpenMetaverse.Tests byte[] sBinary = Encoding.ASCII.GetBytes(s); MemoryStream stream = new MemoryStream(sBinary); - byte[] sFirstFind = Encoding.ASCII.GetBytes("this"); stream.Position = 0L; - bool result = OSDParser.FindByteArray(stream, sFirstFind); + bool result = OSDParser.FindString(stream, "this"); Assert.AreEqual(true, result); Assert.AreEqual(4L, stream.Position); stream.Position = 10L; - byte[] sSecondFind = Encoding.ASCII.GetBytes("teststring"); - result = OSDParser.FindByteArray(stream, sSecondFind); + result = OSDParser.FindString(stream, "teststring"); Assert.AreEqual(true, result); Assert.AreEqual(20L, stream.Position); stream.Position = 25L; - byte[] sThirdNotFind = Encoding.ASCII.GetBytes("notfound"); - result = OSDParser.FindByteArray(stream, sThirdNotFind); + result = OSDParser.FindString(stream, "notfound"); Assert.AreEqual(false, result); Assert.AreEqual(25L, stream.Position); stream.Position = 60L; - byte[] sFourthNotFound = Encoding.ASCII.GetBytes("beginningAndMore"); - result = OSDParser.FindByteArray(stream, sFourthNotFound); + result = OSDParser.FindString(stream, "beginningAndMore"); Assert.AreEqual(false, result); Assert.AreEqual(60L, stream.Position);