* LLSD JSON serialization can now take an optional parameter to enable/disable preserving default values in serialization
* Fixed a regression where OSDMap.ToString() and OSDArray.ToString() were pruning default values after switching from notation output to JSON * Fixed LLSD decoding to ignore case when parsing headers and use <? llsd/binary ?> instead of <?llsd/binary?> git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@3357 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
@@ -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<string, OSD> 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();
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace OpenMetaverse.StructuredData
|
||||
private const int int32Length = 4;
|
||||
private const int doubleLength = 8;
|
||||
|
||||
private static byte[] llsdBinaryHead = Encoding.ASCII.GetBytes("<?llsd/binary?>\n");
|
||||
private const string llsdBinaryHead = "<? llsd/binary ?>\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);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -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
|
||||
/// <param name="stream"></param>
|
||||
/// <param name="toFind"></param>
|
||||
/// <returns></returns>
|
||||
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++;
|
||||
|
||||
@@ -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 = "<?LLSD/Binary?>";
|
||||
const string LLSD_BINARY_HEADER = "<? llsd/binary ?>";
|
||||
const string LLSD_XML_HEADER = "<llsd>";
|
||||
const string LLSD_XML_ALT_HEADER = "<?xml";
|
||||
const string LLSD_XML_ALT2_HEADER = "<?LLSD/XML?>";
|
||||
const string LLSD_XML_ALT2_HEADER = "<? llsd/xml ?>";
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user