Determining which approach to take
Your problem is to create your own serializer for your classes based on the provided API (supposedly fixed).
, , ( ) POCOs DTO, . , , XmlSerializer DataContractSerializer XML Protobuf.NET , , .
, , , , . , / , , . , " ", , , , ( ).
-
, , , . , :
public class ClientData
{
public string Name { get; set; }
public string Email { get; set; }
}
a XmlSerializer - XML:
<ClientData>
<Name>...</Name>
<Email>...</Email>
</ClientData>
, ?name=...&email=... , - . , , , API.
, API, , , , API, ( ), , .
public class ClientData
{
public string Name {get; set;}
public string Email {get; set;}
}
public class PaymentData
{
[MyApiName("payment")]
public decimal PaymentAmount {get; set;}
public string Description {get; set;}
}
MyApiName , :
public class MyApiNameAttribute : Attribute
{
private readonly string _name;
public string Name
{ get { return _name; } }
public MyApiNameAttribute(string name)
{ _name = name; }
}
:
public static string Serialize(object obj)
{
var sb = new StringBuilder();
foreach (var p in obj.GetType().GetProperties())
{
var key = p.Name.ToLowerInvariant();
var value = Uri.EscapeDataString(p.GetValue(obj, null).ToString());
var attr = p
.GetCustomAttributes(typeof(MyApiNameAttribute), false)
.FirstOrDefault() as MyApiNameAttribute;
if (attr != null)
key = attr.Name;
sb.AppendFormat(
System.Globalization.CultureInfo.InvariantCulture,
"{0}={1}&",
key, value);
}
if (sb.Length > 0 && sb[sb.Length - 1] == '&')
sb.Length--;
return sb.ToString();
}
:
var payment = new PaymentData()
{
Description = "some stuff",
PaymentAmount = 50.0m
};
var query = MyApiSerializer.Serialize(payment)
, . . , (, 10 ) HTTP-, , .
, , , , , , , . ; .