我从XML文件中读取销售订单,并将DTO发送到客户是字符串的restful API。返回的DTO包含客户对象,因此与输入对象中的字符串不匹配。
有没有办法创建Customer对象,以便客户字符串作为DTO和返回的客户对象都有效?
基本上我想将字符串客户读入客户对象,并让API认为它只是客户字符串而不是客户对象。
XML文件:
<SalesOrder>
<orderType>SO</orderType>
<customer>10000</customer>
</SalesOrder>
从API返回的客户对象:
<customer>
<number>10000</number>
<internalId>2462</internalId>
<lastModifiedDateTime>0001-01-01</lastModifiedDateTime>
</customer>
客户在SalesOrder中获取和设置方法
[XmlElement("customer")]
public Customer customer
{
get { return Get("customer", new Customer()); }
set { Set(value); }
}
答案 0 :(得分:0)
考虑使用Newtonsoft.Json进行序列化&amp;反序列化
序列化示例:
var customer = new Customer();
var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(Customer);
反序列化@服务器端
var customer = Newtonsoft.Json.JsonConvert.DeserializeObject(serializedObject);
其中 serializedObject 是从请求中获取的字符串。
答案 1 :(得分:0)
为了澄清您的问题,您希望能够设计Customer
DTO,以便它可以用于反序列化以下简单的XML:
<SalesOrder>
<orderType>SO</orderType>
<customer>10000</customer>
</SalesOrder>
以及以下更复杂的XML:
<SalesOrder>
<orderType>SO</orderType>
<customer>
<number>10000</number>
<internalId>2462</internalId>
<lastModifiedDateTime>0001-01-01</lastModifiedDateTime>
</customer>
</SalesOrder>
但是,以下XML无效并且尝试反序列化它应该抛出异常,因为它既有简单的客户编号又有一组复杂的客户值:
<SalesOrder>
<orderType>SO</orderType>
<customer>10000<number>10000</number>
<internalId>2462</internalId>
<lastModifiedDateTime>0001-01-01</lastModifiedDateTime>
</customer>
</SalesOrder>
您还希望能够选择是否应以简单或复杂的格式重新序列化客户。
这可以使用XmlSerializer
来完成,但是对于可能具有文本值的元素类型没有内置支持,或者可能具有一系列子元素 - 但不能同时支持两者。因此,您需要在类本身中支持此逻辑。以下是:
[XmlRoot(ElementName = "customer")]
public class Customer
{
bool? isSimpleFormat;
[XmlIgnore]
public bool IsSimpleFormat { get { return isSimpleFormat == true; } set { isSimpleFormat = value; } }
[XmlIgnore]
bool IsSimpleFormatDefined { get { return isSimpleFormat != null; } }
[XmlIgnore]
bool IsComplexPropertySpecified
{
get
{
return !IsSimpleFormat;
}
set
{
if (IsSimpleFormatDefined && IsSimpleFormat)
{
throw new InvalidOperationException("Cannot set a complex property on a simple customer");
}
IsSimpleFormat = !value;
}
}
[XmlElement(ElementName = "number")]
public string Number { get; set; }
[XmlIgnore]
public bool NumberSpecified { get { return IsComplexPropertySpecified; } set { IsComplexPropertySpecified = value; } }
[XmlElement(ElementName = "internalId")]
public string InternalId { get; set; }
[XmlIgnore]
public bool InternalIdSpecified { get { return IsComplexPropertySpecified; } set { IsComplexPropertySpecified = value; } }
[XmlElement(ElementName = "lastModifiedDateTime")]
public string LastModifiedDateTime { get; set; }
[XmlIgnore]
public bool LastModifiedDateTimeSpecified { get { return IsComplexPropertySpecified; } set { IsComplexPropertySpecified = value; } }
[XmlText]
public string SimpleNumber
{
get
{
return IsSimpleFormat ? Number : null;
}
set
{
IsComplexPropertySpecified = false;
Number = value;
}
}
}
[XmlRoot(ElementName = "SalesOrder")]
public class SalesOrder
{
[XmlElement(ElementName = "orderType")]
public string OrderType { get; set; }
[XmlElement(ElementName = "customer")]
public Customer Customer { get; set; }
}
一些注意事项:
最初构造时,Customer
默认为复杂格式,但会根据反序列化过程中是否遇到子元素或文本值进行调整。一旦设置了格式,它将不再适应,如果以错误的格式遇到其他节点,则会抛出异常。
在构建之后的任何时候,您的代码都可以通过设置布尔属性Customer
来更改是否要以简单或复杂格式序列化Customer.IsSimpleFormat
。
该类型利用XmlSerializer
Customer
模式来跟踪和控制 Button btnActivityB = (Button) findViewById(R.id.some_button);
btnActivityB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(this, MapActivity.class);
LatLng latLng = new LatLng(-20.65,-40.79) //Or any other value...
intent.put("LatLng", latLng);
startActivity(intent);
}
});
的子属性是否被反序列化,并且应该被序列化。
通过使用*Specified
标记该POCO的属性,可以将与复杂POCO对应的元素的XML文本值映射到属性。
示例[XmlText]
。