Tôi đã gặp phải một số hành vi đáng ngạc nhiên khi sử dụng XmlSerializer trong C#. Hãy xem xét đoạn mã sau đây..NET XmlSerializer và các lớp lồng nhau trong C#
public class A : IEnumerable
{
public class B
{
[XmlAttribute]
public string PropA { get; set; }
[XmlElement]
public string PropB { get; set; }
}
public IEnumerator GetEnumerator()
{
yield break;
}
}
class Program
{
static void Main (string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(A.B));
XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
}
}
Trong ví dụ này, tôi cố gắng tuần tự hóa một thể hiện của lớp lồng nhau A.B, chính nó không sử dụng lớp chứa A theo bất kỳ cách nào. Nhưng khi tôi cố gắng để xây dựng các XmlSerializer cho nó, các ngoại lệ sau đây được ném:
InvalidOperationException là unhandled:
Để có XML serializable, loại mà kế thừa từ IEnumerable phải có một thực hiện của chương trình Add (Hệ thống .Object) ở tất cả các cấp của phân cấp thừa kế . Test.A không thực hiện Add (System.Object).
XmlSerializer đang cố gắng áp dụng các ràng buộc serialization đối với loại A khi tôi thực sự cố gắng sắp xếp loại A.B. Tuy nhiên, sự hiểu biết của tôi là ngoài quyền truy cập đặc quyền vào dữ liệu trong các cá thể của kiểu bên ngoài, một kiểu lồng nhau không phải là đặc biệt và hoạt động như thể nó nằm trong một không gian tên.
Sự hiểu biết này không chính xác và làm ngữ nghĩa của các loại lồng nhau hoặc XmlSerializer biện minh cho hành vi này, hoặc điều này có cảm giác giống như một lỗi trong XmlSerializer?
Về vấn đề cụ thể đối với ngữ nghĩa XmlSerializer, có bất kỳ yêu cầu nào về tài liệu thực thi ràng buộc XmlSerializer trên tất cả các kiểu bên ngoài khi được áp dụng với kiểu lồng nhau không?
Bạn không gặp vấn đề với các loại lồng nhau. Lớp A của bạn không có thuộc tính kiểu 'B'. –
Ngoài ra, không sử dụng 'new XmlTextWriter()'. Đó là không được chấp nhận kể từ .NET 2.0. Sử dụng 'XmlWriter.Create()' để thay thế. –
Tôi xin lỗi, nhưng bạn đã bỏ lỡ toàn bộ câu hỏi của tôi. Tôi không cố gắng serialize A, và tôi không cố gắng để serialize B như là một tài sản của A. Tôi đang cố gắng để serialize nó hoàn toàn độc lập của A. Và tôi nhận thức được sự phản đối của TextWriter. Đây là một ví dụ giả vờ ra khỏi đỉnh đầu của tôi mà tôi đã cố giữ ngắn gọn. –