示例#1
0
        public static bool MsgUnPackTable(out LuaTable luatable, ref MessagePackObject pObj)
        {
            LuaTable result = new LuaTable();

            luatable = result;
            var    mPk      = pObj.AsDictionary();
            bool   isString = false;
            string key;
            object value;

            foreach (var item in mPk)
            {
                //parse for key
                MessagePackObject mKey = item.Key;
                if (mKey.IsRaw)
                {
                    key      = mKey.AsString();
                    isString = true;
                }
                else if (true == mKey.IsTypeOf <double>())
                {
                    key = mKey.AsDouble().ToString();
                }
                else
                {
                    LoggerHelper.Error("key type error");
                    return(false);
                }
                //parse for value
                MessagePackObject mValue = item.Value;
                if (mValue.IsRaw)
                {
                    value = mValue.AsString();
                }
                else if (mValue.IsDictionary)
                {
                    LuaTable luatbl;
                    MsgUnPackTable(out luatbl, ref mValue);
                    value = luatbl;
                }
                else if (true == mValue.IsTypeOf <bool>())
                {
                    value = mValue.AsBoolean();
                }
                else if (true == mValue.IsTypeOf <double>())
                {
                    value = mValue.AsDouble();
                }
                else
                {
                    LoggerHelper.Error("value type error");
                    return(false);
                }
                result.Add(key, isString, value);
                isString = false;
            }
            return(true);
        }
示例#2
0
        public static bool MsgUnPackTable(out LuaTable luatable, ref MessagePackObject pObj)
        {
            LuaTable table = new LuaTable();

            luatable = table;
            MessagePackObjectDictionary dictionary = pObj.AsDictionary();
            bool isString = false;

            foreach (KeyValuePair <MessagePackObject, MessagePackObject> pair in dictionary)
            {
                string            str;
                object            obj2;
                MessagePackObject key = pair.Key;
                if (key.IsRaw)
                {
                    str      = key.AsString();
                    isString = true;
                }
                else if (key.IsTypeOf <double>() == true)
                {
                    str = key.AsDouble().ToString();
                }
                else
                {
                    LoggerHelper.Error("key type error", true);
                    return(false);
                }
                MessagePackObject obj4 = pair.Value;
                if (obj4.IsRaw)
                {
                    obj2 = obj4.AsString();
                }
                else if (obj4.IsDictionary)
                {
                    LuaTable table2;
                    MsgUnPackTable(out table2, ref obj4);
                    obj2 = table2;
                }
                else if (obj4.IsTypeOf <bool>() == true)
                {
                    obj2 = obj4.AsBoolean();
                }
                else if (obj4.IsTypeOf <double>() == true)
                {
                    obj2 = obj4.AsDouble();
                }
                else
                {
                    LoggerHelper.Error("value type error", true);
                    return(false);
                }
                table.Add(str, isString, obj2);
                isString = false;
            }
            return(true);
        }
示例#3
0
        private static void TestBoolean(bool val)
        {
            var output = new MemoryStream();

            Packer.Create(output).Pack(val);
            MessagePackObject obj = UnpackOne(output);

            Assert.AreEqual(val, obj.AsBoolean());
            Assert.AreEqual(val, ( bool )obj);
            Assert.IsTrue(obj.IsTypeOf <bool>().GetValueOrDefault());
        }
示例#4
0
        private static JToken CreateToken(MessagePackObject curObj)
        {
            if (curObj.IsDictionary)
            {
                JObject resultObj = new JObject();

                Dictionary <string, MessagePackObject> curDict = curObj.AsDictionary("inputFile");

                foreach (KeyValuePair <string, MessagePackObject> curProp in curDict)
                {
                    resultObj[curProp.Key] = CreateToken(curProp.Value);
                }

                return(resultObj);
            }
            else if (curObj.IsArray)
            {
                JArray resultArray = new JArray();

                IList <MessagePackObject> curArray = curObj.AsList();

                foreach (MessagePackObject curElem in curArray)
                {
                    resultArray.Add(CreateToken(curElem));
                }

                return(resultArray);
            }
            else if (curObj.IsNil)
            {
                return(null);
            }
            else if (curObj.IsTypeOf <Int64>().HasValue&& curObj.IsTypeOf <Int64>().Value)
            {
                return(curObj.AsInt64());
            }
            else if (curObj.IsTypeOf <double>().HasValue&& curObj.IsTypeOf <double>().Value)
            {
                return(curObj.AsDouble());
            }
            else if (curObj.IsTypeOf <string>().HasValue&& curObj.IsTypeOf <string>().Value)
            {
                return(curObj.AsString());
            }
            else if (curObj.IsTypeOf <bool>().HasValue&& curObj.IsTypeOf <bool>().Value)
            {
                return(curObj.AsBoolean());
            }
            else
            {
                throw new Exception("Unknown Type!");
            }
        }
示例#5
0
            protected void ReadPrimitive()

            {
                MessagePackObject lastReadData = mUnpacker.LastReadData;

                if (lastReadData.IsNil)

                {
                    mReader.SetToken(JsonToken.Null, null);
                }
                else if (lastReadData.UnderlyingType == typeof(byte[]))

                {
                    mReader.SetToken(JsonToken.Bytes, lastReadData.AsBinary());
                }
                else if (lastReadData.UnderlyingType == typeof(bool))

                {
                    mReader.SetToken(JsonToken.Boolean, lastReadData.AsBoolean());
                }
                else if (lastReadData.UnderlyingType == typeof(string))

                {
                    mReader.SetToken(JsonToken.String, lastReadData.AsString());
                }
                else if (lastReadData.UnderlyingType == typeof(double) ||

                         lastReadData.UnderlyingType == typeof(float))

                {
                    mReader.SetToken(JsonToken.Float, lastReadData.ToObject());
                }
                else if (lastReadData.IsTypeOf <sbyte>() == true ||

                         lastReadData.IsTypeOf <short>() == true ||

                         lastReadData.IsTypeOf <ushort>() == true ||

                         lastReadData.IsTypeOf <int>() == true ||

                         lastReadData.IsTypeOf <uint>() == true ||

                         lastReadData.IsTypeOf <long>() == true ||

                         lastReadData.IsTypeOf <ulong>() == true)

                {
                    mReader.SetToken(JsonToken.Integer, lastReadData.ToObject());
                }
            }
示例#6
0
        private object GetObject(MessagePackObject str)
        {
            if (str.UnderlyingType == typeof(byte[]))
            {
                return(System.Text.Encoding.ASCII.GetString(str.AsBinary()));
            }
            else if (str.UnderlyingType == typeof(string))
            {
                return(str.AsString());
            }
            else if (str.UnderlyingType == typeof(byte))
            {
                return(str.AsByte());
            }
            else if (str.UnderlyingType == typeof(bool))
            {
                return(str.AsBoolean());
            }

            return(str);
        }
		//this is a ridiculous method
		Dictionary<string, object> TypifyDictionary(MessagePackObjectDictionary dict)
		{
			Dictionary<string, object> returnDictionary = new Dictionary<string, object>();
			
			foreach (var pair in dict)
			{
				MessagePackObject obj = (MessagePackObject)pair.Value;
				string key = System.Text.Encoding.ASCII.GetString ((byte[])pair.Key);

				if (obj.UnderlyingType == null)
					continue;
				
				if (obj.IsRaw) {
					if (obj.UnderlyingType == typeof(string)) {
						if (pair.Key.IsRaw && pair.Key.IsTypeOf (typeof(Byte[])).Value)
							returnDictionary [key] = obj.AsString ();
						else
							returnDictionary [pair.Key.ToString ()] = obj.AsString ();
					}
					else if (obj.IsTypeOf (typeof(int)).Value)
						returnDictionary [pair.Key.ToString ()] = (int)obj.ToObject ();
					else if (obj.IsTypeOf (typeof(Byte[])).Value) {
						if (key == "payload") 
							returnDictionary [key] = (byte[])obj;
						else 
							returnDictionary [key] = System.Text.Encoding.ASCII.GetString ((Byte[])obj.ToObject ());
					} else
						throw new Exception ("I don't know type: " + pair.Value.GetType ().Name);
				} else if (obj.IsArray) {
					List<object> arr = new List<object> ();
					foreach (var o in obj.ToObject() as MessagePackObject[]) {
						if (o.IsDictionary)
							arr.Add (TypifyDictionary (o.AsDictionary ()));
						else if (o.IsRaw)
							arr.Add (System.Text.Encoding.ASCII.GetString ((byte[])o));
						else if (o.IsArray) {
							var enu = o.AsEnumerable ();
							List<object> array = new List<object> ();
							foreach (var blah in enu)
								array.Add (blah as object);

							arr.Add (array.ToArray ());
						} else if (o.ToObject ().GetType () == typeof(Byte)) //this is a hack because I don't know what type you are...
							arr.Add (o.ToString ());
					}

					if (pair.Key.IsRaw && pair.Key.IsTypeOf (typeof(Byte[])).Value)
						returnDictionary.Add (key, arr);
					else
						returnDictionary.Add (key, arr);
				} else if (obj.IsDictionary) {
					if (pair.Key.IsRaw && pair.Key.IsTypeOf(typeof(Byte[])).Value)
						returnDictionary [key] = TypifyDictionary (obj.AsDictionary ());
					else 
						returnDictionary [pair.Key.ToString ()] = TypifyDictionary (obj.AsDictionary ());
				} else if (obj.IsTypeOf (typeof(UInt16)).Value) {
					if (pair.Key.IsRaw && pair.Key.IsTypeOf (typeof(Byte[])).Value)
						returnDictionary [key] = obj.AsUInt16 ();
					else
						returnDictionary [pair.Key.ToString ()] = obj.AsUInt16 ();
				} else if (obj.IsTypeOf (typeof(UInt32)).Value) {
					if (pair.Key.IsRaw && pair.Key.IsTypeOf (typeof(Byte[])).Value)
						returnDictionary [key] = obj.AsUInt32 ();
					else
						returnDictionary [pair.Key.ToString ()] = obj.AsUInt32 ();
				} else if (obj.IsTypeOf (typeof(bool)).Value) {
					if (pair.Key.IsRaw && pair.Key.IsTypeOf (typeof(Byte[])).Value)
						returnDictionary [key] = obj.AsBoolean ();
					else
						returnDictionary [pair.Key.ToString ()] = obj.AsBoolean ();
				}
				else 
					throw new Exception("Don't know type: " + obj.ToObject().GetType().Name);
			}
			
			return returnDictionary;
		}
示例#8
0
        Dictionary <string, object> TypifyDictionary(IDictionary <MessagePackObject, MessagePackObject> dict)
        {
            Dictionary <string, object> returnDictionary = new Dictionary <string, object>();

            foreach (var pair in dict)
            {
                MessagePackObject obj = (MessagePackObject)pair.Value;

                if (obj.UnderlyingType == null)
                {
                    continue;
                }

                if (obj.IsRaw)
                {
                    if (obj.IsTypeOf(typeof(string)).Value)
                    {
                        returnDictionary[pair.Key.AsString()] = new string(obj.AsCharArray());
                    }
                    else if (obj.IsTypeOf(typeof(int)).Value)
                    {
                        returnDictionary[pair.Key.AsString()] = (int)obj.ToObject();
                    }
                    else
                    {
                        throw new Exception("I don't know type: " + pair.Value.GetType().Name);
                    }
                }
                else if (obj.IsArray)
                {
                    List <object> arr = new List <object>();
                    //Console.WriteLine(obj.UnderlyingType.Name);
                    foreach (var o in obj.ToObject() as MessagePackObject[])
                    {
                        if (o.IsDictionary)
                        {
                            arr.Add(TypifyDictionary(o.AsDictionary()));
                        }
                        else if (o.IsRaw)
                        {
                            arr.Add(o.AsString());
                        }
                    }

                    returnDictionary.Add(pair.Key.AsString(), arr);
                }
                else if (obj.IsDictionary)
                {
                    returnDictionary[pair.Key.AsString()] = TypifyDictionary(obj.AsDictionary() as IDictionary <MessagePackObject, MessagePackObject>);
                }
                else if (obj.IsTypeOf(typeof(UInt16)).Value)
                {
                    returnDictionary[pair.Key.AsString()] = obj.AsUInt16();
                }
                else if (obj.IsTypeOf(typeof(UInt32)).Value)
                {
                    returnDictionary[pair.Key.AsString()] = obj.AsUInt32();
                }
                else if (obj.IsTypeOf(typeof(bool)).Value)
                {
                    returnDictionary[pair.Key.AsString()] = obj.AsBoolean();
                }
                else
                {
                    throw new Exception("hey what the f**k are you: " + obj.ToObject().GetType().Name);
                }
            }

            return(returnDictionary);
        }
示例#9
0
        public static object Map(Type targetType, MessagePackObject source, PropertyInfo property = null)
        {
            if (source.IsNil)
            {
                return(null);
            }
            if (targetType == typeof(string))
            {
                return(source.AsString());
            }
            if (targetType == typeof(int) || targetType == typeof(int?))
            {
                return(source.AsInt32());
            }
            if (targetType == typeof(uint) || targetType == typeof(uint?))
            {
                return(source.AsUInt32());
            }
            if (targetType == typeof(long) || targetType == typeof(long?))
            {
                return(source.AsInt64());
            }
            if (targetType == typeof(ulong) || targetType == typeof(ulong?))
            {
                return(source.AsUInt64());
            }
            if (targetType == typeof(float) || targetType == typeof(float?))
            {
                return(source.AsSingle());
            }
            if (targetType == typeof(double) || targetType == typeof(double?))
            {
                return(source.AsDouble());
            }
            if (targetType == typeof(bool) || targetType == typeof(bool?))
            {
                return(source.AsBoolean());
            }
            if (targetType == typeof(byte[]))
            {
                return(source.AsBinary());
            }
            if (targetType == typeof(byte) || targetType == typeof(byte?))
            {
                return(source.AsByte());
            }
            if (targetType == typeof(sbyte) || targetType == typeof(sbyte?))
            {
                return(source.AsSByte());
            }
            if (targetType == typeof(char[]))
            {
                return(source.AsCharArray());
            }
            if (targetType == typeof(short) || targetType == typeof(short?))
            {
                return(source.AsInt16());
            }
            if (targetType == typeof(ushort) || targetType == typeof(ushort?))
            {
                return(source.AsUInt16());
            }
            if (targetType == typeof(DateTime) || targetType == typeof(DateTime?))
            {
                return(MapDateTime(property, source));
            }
            if (targetType == typeof(IList <MessagePackObject>))
            {
                return(source.AsList());
            }
            if (targetType == typeof(IEnumerable <MessagePackObject>))
            {
                return(source.AsEnumerable());
            }

            var ti = targetType.GetTypeInfo();

            if (targetType == typeof(MessagePackObject))
            {
                return(source);
            }

            if (ti.IsGenericType && (targetType.GetGenericTypeDefinition() == typeof(List <>) ||
                                     targetType.GetGenericTypeDefinition() == typeof(IList <>)))
            {
                return(MapList(targetType, source.AsList()));
            }

            if (ti.IsClass && source.IsList)
            {
                return(MapClass(targetType, source));
            }

            if (ti.IsClass && source.IsMap)
            {
                return(MapDictionary(targetType, source.AsDictionary()));
            }

            if (ti.IsEnum)
            {
                return(MapEnum(targetType, source));
            }

            throw new MessagePackMapperException(
                      $"Cannot find MsgPackObject converter for type {targetType.FullName}.");
        }