nedeniyle ondalık ayrıştırmasında XML deserialization çöküyor Bir nesneye XML ayrıştırmaya çalıştığımda System.FormatException atıyorum. Anlayabildiğim kadarıyla, System.Xml.Serialization.XmlSerializer.Deserialize'de kullanılan, ondalık karakter olarak bir nokta beklediği, ancak xml'in bir virgül içerdiği kültürden kaynaklanıyor. aşağıdaki gibiBiçimlendirme
nesne görünür:
public sealed class Transaction
{
[XmlElement("transactionDate")]
public DateTime TransactionDate { get; set; }
[XmlElement("transactionAmount")]
public decimal Amount { get; set; }
[XmlElement("transactionDescription")]
public string Description { get; set; }
[XmlElement("transactionType")]
public int Type { get; set; }
public static Transaction FromXmlString(string xmlString)
{
var reader = new StringReader(xmlString);
var serializer = new XmlSerializer(typeof(Transaction));
var instance = (Transaction) serializer.Deserialize(reader);
return instance;
}
}
xml:
<transaction>
<transactionDate> 2013-07-02 <transactionDate>
<transactionAmount>-459,00</transactionAmount>
<transactionDescription>description</transactionDescription>
<transactionType>1</transactionType>
</transaction>
bu benim kendi kültürünü kullanarak ilk ayrıştırır ikinci özelliği sunarak çalışmak yaptık
:
ilave özellik t açığa
namespace MyNamespace
{
[XmlRoot("transaction"), XmlType("Transaction")]
public sealed class Transaction
{
[XmlElement("transactionDate")]
public DateTime TransactionDate { get; set; }
[XmlElement("transactionAmount")]
public string Amount { get; set; }
public decimal AmountAsDecimal {
get
{
decimal value;
Decimal.TryParse(Amount, NumberStyles.Any, CultureInfo.CreateSpecificCulture("sv-SE"), out value);
return value;
}
}
[XmlElement("transactionDescription")]
public string Description { get; set; }
[XmlElement("transactionType")]
public int Type { get; set; }
public static Transaction FromXmlString(string xmlString)
{
var reader = new StringReader(xmlString);
var serializer = new XmlSerializer(typeof(Transaction));
var instance = (Transaction) serializer.Deserialize(reader);
return instance;
}
}
}
şapka ben orada istemiyorum.
Bu yüzden sorum şu: her öğenin üzerinde yineleme yapmadan ve onu "el ile" nesnesine ayrıştırma/atamadan yapmanın başka bir yolu var mı?
[burada] (http://forums.asp.net/t/1365779.aspx) 'den XmlSerializer'ın [bu W3C şemasını] kullanması gibi görünüyor (http://www.w3.org/TR/xmlschema -2 /) ve makineler/kültürler arasında serileştirme/serileştirme sorunlarından kaçınmak için kültürden nispeten bağımsız olması gerekir. Ben _guess_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ muhtemelen muhtemelen en iyi yoldur (belki "[xmlIgnore]" ile "AmountAsDecimal", sadece biraz daha belirgin) Ne olursa olsun, seri hale getirilmiş nesnelerin tamamen veri aktarım nesneleri olduğu ve uygulamanız/iş mantığınızdan soyutlandığı sürece, o zaman çok fazla acı vermemeliyim umarım. –
Ama ikinci okumada, hangi özellik ayrıştırıcılarını çevirip hangi dizileri çevirmek isteyebilirsiniz. 'Public decimal Amount' değerini, _code_ API'nizde normal şekilde alacağınız/ayarladığınız, ancak [XmlIgnore] 'olarak sahip olduğunuz değer olarak gösterin.Ardından, Get/set uygulamaları özel kültürünüzü biçimlendirecek/ayrıştıracak bir "public string SerializedAmount" özelliğine sahip olmalısınız. En azından bu şekilde, 'Transaction' nesnesinin _write_ için kullandığınız API'nin dizeyi nasıl biçimlendireceğini düşünmesi gerekmez; sadece bir "ondalık" değeri yazar. Yazdığınız şekilde (örneğin, 'SerializedAmount' özelliğini değiştirirseniz) kodunuz umursamıyor. –