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 + "--"); } }
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); }