Nếu bạn đang sử dụng XmlSerializer
, XmlAttributeOverrides
có lẽ là những gì bạn cần.
Cập nhật: Tôi đã nghiên cứu khả năng tùy chỉnh định dạng ngày và, theo như tôi thấy, không có giải pháp đẹp nào tồn tại.
Một tùy chọn, như đã được đề cập bởi những người khác, là triển khai IXmlSerializable
. Điều này có nhược điểm là bạn hoàn toàn chịu trách nhiệm (de-) serializing toàn bộ đối tượng (-graph).
Tùy chọn thứ hai, với danh sách khá nhiều hạn chế, là phân lớp lớp cơ sở (bạn đã đề cập đến nó như là một thay thế trong bài đăng của bạn). Với một số hệ thống ống nước khá, chuyển đổi từ và đến các đối tượng ban đầu, và việc sử dụng các XmlAttributeOverrides
bạn có thể xây dựng một cái gì đó như thế này:
public class Test
{
public int Prop { get; set; }
public DateTime TheDate { get; set; }
}
public class SubTest : Test
{
private string _customizedDate;
public string CustomizedDate
{
get { return TheDate.ToString("yyyyMMdd"); }
set
{
_customizedDate = value;
TheDate = DateTime.ParseExact(_customizedDate, "yyyyMMdd", null);
}
}
public Test Convert()
{
return new Test() { Prop = this.Prop };
}
}
// Serialize
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributes = new XmlAttributes();
attributes.XmlIgnore = true;
overrides.Add(typeof(Test), "TheDate", attributes);
XmlSerializer xs = new XmlSerializer(typeof(SubTest), overrides);
SubTest t = new SubTest() { Prop = 10, TheDate = DateTime.Now, CustomizedDate="20120221" };
xs.Serialize(fs, t);
// Deserialize
XmlSerializer xs = new XmlSerializer(typeof(SubTest));
SubTest t = (SubTest)xs.Deserialize(fs);
Test test = t.Convert();
Nó không phải là đẹp, nhưng nó sẽ làm việc.
Lưu ý rằng bạn đang thực sự (de-) tuần tự hóa các đối tượng SubTest trong trường hợp này. Nếu loại chính xác là quan trọng, thì đây cũng không phải là một lựa chọn.
Nguồn
2012-02-21 12:21:26
Btw, chúng tôi đang sử dụng .NET 4.0 – Schiavini
Và XmlSerializer – Schiavini