2010-03-23 41 views
11

Tôi có một lớp cơ sở với một thuộc tính được gọi là Tên, có một thuộc tính XmlText.Thuộc tính XmlText trong lớp cơ sở ngắt nối tiếp

Khi một lớp được thừa kế được đăng tôi nhận được một ngoại lệ nói:

Có lỗi khi phản ánh loại '[type name]'. ---> System.InvalidOperationException: Không thể tuần tự hóa đối tượng thuộc loại '[loại tên]'. Loại cơ sở '[tên loại cơ sở]' có nội dung đơn giản và chỉ có thể được mở rộng bằng cách thêm các phần tử XmlAttribute . Vui lòng xem xét thay đổi thành viên XmlText của lớp cơ sở thành mảng chuỗi.

Dưới đây là định nghĩa lớp học của tôi, lỗi xảy ra khi tuần tự hóa thành xml.

[Serializable] 
public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 
} 

[Serializable] 
public class Vendor : LookupItem 
{ 
    public string ContactNumber { get; set; } 
} 

[Serializable] 
public class Vendors : List<Vendor> 
{ 

} 

Trả lời

15

Dường như điều này xảy ra vì lớp LookupItem không có phần tử con trong biểu diễn XML của nó. Do đó, XmlSerializer coi nó là một phần tử XML simpleContent. Nếu bạn thêm thuộc tính mới vào LookupItem, nó sẽ được tuần tự hóa thành một phần tử XML, nó hoạt động tốt.

tôi chỉ dành một vài phút nhìn vào XML có sẵn thuộc tính serialization, nhưng tôi không thể tìm thấy bất kỳ mà sẽ cho phép để xác định rằng loại KHÔNG phải là một yếu tố simpleContent ...

Vì vậy, tôi nghĩ rằng bạn có thể làm cho nó hoạt động bằng cách thêm một thuộc tính giả hoặc trường mà bạn không bao giờ sử dụng trong lớp LookupItem. Nếu bạn không bao giờ gán một giá trị cho nó, nó sẽ vẫn giữ nguyên và sẽ không được tuần tự hóa, nhưng nó sẽ ngăn không cho lớp của bạn được coi là simpleContent. Tôi biết đó là một workaround bẩn, nhưng tôi thấy không có cách nào dễ dàng khác ...

public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 

    public object _dummy; 
} 

(BTW, lưu ý rằng thuộc tính Serializable là không cần thiết cho serialization XML.)

Dù sao, bạn có thực sự cần để tuần tự hóa Name dưới dạng văn bản XML? Điều này khá phổ biến, thường các phần tử XML có nội dung đơn giản (văn bản) hoặc các phần tử con ... Một kết hợp cả hai làm cho XML khó đọc hơn, vì vậy trừ khi bạn bắt buộc phải làm điều đó, tôi khuyên bạn nên tuần tự hóa Name làm thuộc tính hoặc yếu tố con.

Các vấn đề liên quan