internal static JValue FromBson(BsonTypes bsonType, byte[] buffer, ref int offset) { switch (bsonType) { case BsonTypes.BsonBoolean: return(new JValue(buffer[offset++] != 0 ? true : false)); case BsonTypes.BsonDateTime: var dt = (DateTime)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.DateTime); return(new JValue(dt)); case BsonTypes.BsonDouble: var dbl = (double)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Double); return(new JValue(dbl)); case BsonTypes.BsonInt32: var i32 = (Int32)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int32); return(new JValue(i32)); case BsonTypes.BsonInt64: var i64 = (Int64)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int64); return(new JValue(i64)); case BsonTypes.BsonString: var str = (string)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.String); return(new JValue(str)); default: throw new Exception("Unsupported type"); } }
internal static JObject FromBson(byte[] buffer, ref int offset, InstanceFactory factory = null) { JObject result = new JObject(); int startingOffset = offset; int len = (Int32)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int32); while (offset < startingOffset + len - 1) { // get the element type var bsonType = (BsonTypes)buffer[offset++]; // get the element name var idxNul = JToken.FindNul(buffer, offset); if (idxNul == -1) { throw new Exception("Missing ename terminator"); } var ename = JToken.ConvertToString(buffer, offset, idxNul - offset); offset = idxNul + 1; JToken item = null; switch (bsonType) { case BsonTypes.BsonArray: item = JArray.FromBson(buffer, ref offset, factory); break; case BsonTypes.BsonDocument: item = JObject.FromBson(buffer, ref offset, factory); break; case BsonTypes.BsonNull: item = new JValue(); break; case BsonTypes.BsonBoolean: case BsonTypes.BsonDateTime: case BsonTypes.BsonDouble: case BsonTypes.BsonInt32: case BsonTypes.BsonInt64: case BsonTypes.BsonString: item = JValue.FromBson(bsonType, buffer, ref offset); break; } result.Add(ename, item); } if (buffer[offset++] != 0) { throw new Exception("bad format - missing trailing null on bson document"); } return(result); }
public static JToken FromBson(byte[] buffer, InstanceFactory factory = null) { var offset = 0; var len = (Int32)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int32); JToken dserResult = null; while (offset < buffer.Length - 1) { var bsonType = (BsonTypes)buffer[offset++]; // eat the empty ename var idxNul = JToken.FindNul(buffer, offset); if (idxNul == -1) { throw new Exception("Missing ename terminator"); } var ename = JToken.ConvertToString(buffer, offset, idxNul - offset); offset = idxNul + 1; switch (bsonType) { case BsonTypes.BsonDocument: dserResult = JObject.FromBson(buffer, ref offset, factory); break; case BsonTypes.BsonArray: dserResult = JArray.FromBson(buffer, ref offset, factory); break; default: throw new Exception("unexpected top-level object type in bson"); } } if (buffer[offset++] != 0) { throw new Exception("bad format - missing trailing null on bson document"); } return(dserResult); }
internal static JArray FromBson(byte[] buffer, ref int offset, InstanceFactory factory = null) { BsonTypes elementType = (BsonTypes)0; int startingOffset = offset; int len = (Int32)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int32); var list = new ArrayList(); int idx = 0; while (offset < startingOffset + len - 1) { // get the element type var bsonType = (BsonTypes)buffer[offset++]; if (elementType == (BsonTypes)0) { elementType = bsonType; } if (bsonType != elementType) { throw new Exception("all array elements must be of the same type"); } // get the element name var idxNul = JToken.FindNul(buffer, offset); if (idxNul == -1) { throw new Exception("Missing ename terminator"); } var ename = JToken.ConvertToString(buffer, offset, idxNul - offset); var elemIdx = int.Parse(ename); if (elemIdx != idx) { throw new Exception("sparse arrays are not supported"); } ++idx; offset = idxNul + 1; JToken item = null; switch (bsonType) { case BsonTypes.BsonArray: item = JArray.FromBson(buffer, ref offset, factory); break; case BsonTypes.BsonDocument: item = JObject.FromBson(buffer, ref offset, factory); break; case BsonTypes.BsonNull: item = new JValue(); break; case BsonTypes.BsonBoolean: case BsonTypes.BsonDateTime: case BsonTypes.BsonDouble: case BsonTypes.BsonInt32: case BsonTypes.BsonInt64: case BsonTypes.BsonString: item = JValue.FromBson(bsonType, buffer, ref offset); break; } list.Add(item); } if (buffer[offset++] != 0) { throw new Exception("bad format - missing trailing null on bson document"); } return(new JArray((JToken[])list.ToArray(typeof(JToken)))); }