コード例 #1
0
        public void Serialize(Stream writeStream, Type[] types, object[] argValues, string[] names)
        {
            if (!argValues.Any())
            {
                return;
            }
            string boundary = "----RpcOverHttp" + DateTime.Now.Ticks.ToString("x");

            //request.ContentType = "multipart/form-data; boundary=" + boundary;
            //request.Method = "POST";

            using (var writer = new StreamWriter(writeStream, Encoding.UTF8))
            {
                for (int i = 0; i < argValues.Length; i++)
                {
                    var type = types[i];
                    var val  = argValues[i];
                    if (val == null)
                    {
                        continue;
                    }
                    writer.WriteLine("--" + boundary);
                    writer.WriteLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", names[i]));
                    writer.WriteLine();
                    if (typeof(Stream).IsAssignableFrom(types[i]))
                    {
                        (val as Stream).CopyTo(writeStream);
                    }
                    else if (simpleTypes.Any(x => x == types[i]))
                    {
                        writer.WriteLine(val);
                    }
                    else if (typeof(IRpcEventHandleResult).IsAssignableFrom(type))
                    {
                        CoreObject.Serialize(writer.BaseStream, type, val, names[i]);
                    }
                    else if (types[i].IsClass && !types[i].IsAbstract)
                    {
                        var properties = types[i].GetProperties().Where(x => x.CanRead && x.CanWrite);
                        SerializeInternal(writer, boundary,
                                          properties.Select(x => x.PropertyType).ToArray(),
                                          properties.Select(x => x.GetValue(argValues[i])).ToArray(),
                                          properties.Select(x => x.Name).ToArray());
                    }
                    else
                    {
                        throw new NotSupportedException(string.Format("parameter at {0} using type {1} is not supported by HttpMultipartSerializer", i, types[i]));
                    }
                }
                writer.WriteLine("--" + boundary + "--");
            }
        }
コード例 #2
0
        public object[] Deserialize(Stream readStream, Type[] types, string[] names)
        {
            var retVal = new object[types.Length];

            if (!types.Any())
            {
                return(retVal);
            }
            var parser = new HttpMultipartParser.MultipartFormDataParser(readStream);

            for (int i = 0; i < types.Length; i++)
            {
                var type = types[i];
                if (simpleTypes.Any(x => x == types[i]))
                {
                    var part = parser.BodyParts.FirstOrDefault(x => x.Name.Equals(names[i], StringComparison.OrdinalIgnoreCase));
                    if (part == null)
                    {
                        retVal[i] = null;
                    }
                    else
                    {
                        var token = Newtonsoft.Json.Linq.JToken.Parse((part as ParameterPart).Data);
                        retVal[i] = token.ToObject(type);
                    }
                }
                else if (typeof(Stream).IsAssignableFrom(type))
                {
                    var part = parser.BodyParts.FirstOrDefault(x => x.Name.Equals(names[i], StringComparison.OrdinalIgnoreCase));
                    if (part == null)
                    {
                        retVal[i] = null;
                    }
                    else
                    {
                        retVal[i] = (part as FilePart).Data;
                    }
                }
                else if (typeof(IRpcEventHandleResult).IsAssignableFrom(type))
                {
                    var part = parser.BodyParts.FirstOrDefault(x => x.Name.Equals(names[i], StringComparison.OrdinalIgnoreCase));
                    if (part == null)
                    {
                        retVal[i] = null;
                    }
                    else
                    {
                        retVal[i] = CoreObject.Deserialize(type, (part as FilePart).Data);
                    }
                }
                else if (type.IsClass && !type.IsAbstract)
                {
                    //class model
                    try
                    {
                        var properties = type.GetProperties().Where(x => x.CanRead && x.CanWrite).ToArray();
                        var obj        = Activator.CreateInstance(type);
                        var values     = DeserializeInternal(parser, properties.Select(x => x.PropertyType).ToArray(), properties.Select(x => x.Name).ToArray());
                        for (int idx = 0; idx < properties.Length; idx++)
                        {
                            properties[idx].SetValue(obj, values[i]);
                        }
                        retVal[i] = obj;
                    }
                    catch (Exception ex)
                    {
                        throw new NotSupportedException(string.Format("parameter at {0} using type {1} is not supported by HttpMultipartSerializer", i, types[i]), ex);
                    }
                }
                else
                {
                    throw new NotSupportedException(string.Format("parameter at {0} using type {1} is not supported by HttpMultipartSerializer", i, types[i]));
                }
            }
            return(retVal);
        }