private string SerializeObjectValue(object value, Type valueType) { StringBuilder bld = new StringBuilder(); if ((valueType.IsArray) || (valueType.GetTypeInfo().IsGenericType)) { if (valueType.Name == "Dictionary`2") { bld.Append("{"); IDictionary <string, object> collection = (IDictionary <string, object>)value; bool first = true; foreach (var keyVal in collection) { if (!first) { bld.Append(","); } first = false; string serialized = SerializeValue(keyVal.Value); bld.Append("\"" + keyVal.Key + "\":" + serialized); } bld.Append("}"); } else { bld.Append(valueType.Name == "HashSet`1" ? "<" : "["); IEnumerable collection = (IEnumerable)value; bool first = true; foreach (object val in collection) { if (!first) { bld.Append(","); } first = false; bld.Append(SerializeValue(val)); } bld.Append(valueType.Name == "HashSet`1" ? ">" : "]"); } } // if property is ORID type it needs to be serialized as ORID else if (valueType.GetTypeInfo().IsClass&& (valueType.Name == "ORID")) { bld.Append(((ORID)value).RID); } else if (valueType.GetTypeInfo().IsClass&& (valueType.Name == "ODocument")) { bld.AppendFormat("({0})", SerializeDocument((ODocument)value)); } else if (valueType.GetTypeInfo().IsClass&& (valueType.Name == "OEmbeddedRidBag")) { //bld.AppendFormat("({0})", SerializeDocument((ODocument)value)); OEmbeddedRidBag ridbag = (OEmbeddedRidBag)value; if (ridbag.Count > 0) { BinaryBuffer buffer = new BinaryBuffer(); bld.Append("%"); buffer.Write((byte)1); // config buffer.Write(ridbag.Count); //size foreach (var item in ridbag) { buffer.Write(item); } bld.Append(Convert.ToBase64String(buffer.ToArray())); bld.Append(";"); } } return(bld.ToString()); }
public byte[] Serialize(ODocument document) { var buffer = new BinaryBuffer(); ODocument schema = null; // Until Implementing schema this is null class // Version buffer.Add((byte)SERIALIZER_VERSION); // Class Name if (!String.IsNullOrEmpty(document.OClassName)) { buffer.WriteVariant(document.OClassName.Length); var className = BinarySerializer.ToArray(document.OClassName); buffer.AddRange(className); } else { var length = BinarySerializer.ToArray((int)0); buffer.AddRange(length); } // Header var propNames = document.Keys.Where(k => !k.StartsWith("@")).ToArray(); var pos = new int[propNames.Length]; var val = new KeyValuePair <string, Object> [propNames.Length]; for (var i = 0; i < propNames.Length; i++) { var prop = propNames[i]; if (schema != null) { } else { buffer.WriteVariant(prop.Length); var propName = BinarySerializer.ToArray(prop); buffer.AddRange(propName); pos[i] = buffer.Allocate(sizeof(int) + 1); } val[i] = new KeyValuePair <string, object>(prop, document.GetField <object>(prop)); } buffer.WriteVariant(0); // Header stop byte // Data for (int i = 0; i < val.Length; i++) { int pointer = 0; var value = val[i].Value; if (value != null) { var valueType = TypeConverter.TypeToDbName(value.GetType()); pointer = writeOType(buffer, value, valueType, getLinkedType(valueType, val[i].Key)); buffer.Write(pos[i], pointer); if (schema == null) { buffer.Write((pos[i] + sizeof(int)), (byte)valueType); } } } return(buffer.ToArray()); }