Tôi nhận được một lỗi System.FormatException khi tôi cố phân tích cú pháp XML thành một đối tượng. Theo như tôi có thể nói, đó là do văn hóa được sử dụng trong System.Xml.Serialization.XmlSerializer.Deserialize, mà dự kiến một dấu chấm làm ký tự thập phân, nhưng xml chứa dấu phẩy.Xảy ra lỗi deserialization trên phân tích cú pháp thập phân do định dạng
Đối tượng trông như sau:
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;
}
}
Các xml:
<transaction>
<transactionDate> 2013-07-02 <transactionDate>
<transactionAmount>-459,00</transactionAmount>
<transactionDescription>description</transactionDescription>
<transactionType>1</transactionType>
</transaction>
Tôi đã thực hiện nó hoạt động bằng cách giới thiệu một tài sản thứ hai mà phân tích là người đầu tiên sử dụng nền văn hóa của riêng tôi:
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;
}
}
}
hiển thị thêm thuộc tính t mũ tôi không muốn ở đó.
Vì vậy, câu hỏi của tôi là: có cách nào khác để làm điều này, mà không cần lặp qua từng phần tử và phân tích cú pháp/gán nó cho đối tượng "theo cách thủ công" không?
Từ [tại đây] (http://forums.asp.net/t/1365779.aspx) có vẻ như XmlSerializer đang sử dụng [lược đồ W3C này] (http://www.w3.org/TR/xmlschema -2 /) và được coi là tương đối độc lập với văn hóa để tránh các vấn đề serialization/deserialization trên các máy móc/văn hóa. Tôi sẽ _guess_ rằng những gì bạn đang làm bây giờ có lẽ là cách tốt nhất (có thể tô điểm 'AmountAsDecimal' với' [XmlIgnore] 'chỉ vì vậy nó là một chút rõ ràng hơn). Bất kể, miễn là các đối tượng được tuần tự hóa của bạn hoàn toàn là các đối tượng chuyển dữ liệu và được trừu tượng hóa từ logic ứng dụng/kinh doanh của bạn, thì nó không làm tổn thương quá nhiều tôi hy vọng. –
Nhưng vào lần đọc thứ hai, bạn có thể muốn lật thuộc tính nào phân tích cú pháp và tuần tự hóa nào. Hiển thị 'Số thập phân công khai' làm giá trị mà bạn sẽ nhận được/đặt bình thường trong _code_ API của bạn nhưng có nó là' [XmlIgnore] '.Sau đó, có một thuộc tính 'chuỗi công khai SerializedAmount' có cài đặt get/set sẽ định dạng/phân tích cú pháp văn hóa chuyên ngành của bạn. Ít nhất theo cách này, API bạn sử dụng để _write_ đối tượng 'Transaction' không phải nghĩ cách định dạng chuỗi; nó chỉ viết một giá trị 'thập phân'. Nếu cách bạn viết nó (bạn thay đổi thuộc tính 'SerializedAmount' chẳng hạn) thì mã của bạn không quan tâm. –