2013-11-14 12 views
10

Tôi gặp sự cố với DataContractSerializer. Tôi sử dụng nó để tạo ra các cá thể lớp từ XML được trả về bởi ASP.NET Web Service. Nhưng thực sự nguồn dữ liệu không quan trọng ở đây. Để làm cho toàn bộ trường hợp dễ dàng hơn để gỡ lỗi tôi đã tạo ra một dự án thử nghiệm đơn giản chỉ với serialization và vấn đề vẫn còn xảy ra.Một số thuộc tính không được deserialized bằng cách sử dụng DataContractSerializer

Đây là XML của tôi:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<GetTestURL p1:type="MyApp.GetTestUrlInfo" xmlns:p1="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices"> 
    <TestURL>http://bing.com</TestURL> 
    <UserCount p1:type="Edm.Int32">1</UserCount> 
    <InitialCount p1:type="Edm.Int32">1</InitialCount> 
    <AverageExecutionTime p1:type="Edm.Int32">43</AverageExecutionTime> 
</GetTestURL> 

Lớp tôi đang cố gắng để deserialize XML để:

[DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")] 
public class TestInfo 
{ 
    [DataMember(Name = "TestURL")] 
    public Uri TestUri { get; private set; } 

    [DataMember(Name = "UserCount")] 
    public int UserCount { get; private set; } 

    [DataMember(Name = "InitialCount")] 
    public int InitialCount { get; private set; } 

    [DataMember(Name = "AverageExecutionTime")] 
    public int AverageExecutionTime { get; private set; } 
} 

Và serialization lớp helper của tôi: Mã

public static class SerializationHelper<T> 
{ 
    private static DataContractSerializer _serializer = new DataContractSerializer(typeof(T)); 

    public static T Deserialize(Stream source) 
    { 
     return (T)_serializer.ReadObject(source); 
    } 
} 

kiểm tra:

// Test program 
public static void Main() 
{ 
    TestInfo info = null; 
    using (var stream = File.Open("Input.xml", FileMode.Open, FileAccess.Read)) 
    { 
     info = SerializationHelper<TestInfo>.Deserialize(stream); 
    } 
} 

Sau khi thiết lập brakepoint ở phần cuối của phương pháp này tôi thấy như sau:

enter image description here

Như bạn có thể thấy, cả hai AverageExecutionTimeInitialCount không deserialized và có int giá trị mặc định. Họ nên đặt thành 431, bởi vì các giá trị này nằm trong XML.

Nó thậm chí còn lạ lùng hơn với tôi, rằng bất động sản UserCount được thực hiện đúng, nhưng thực sự nó không khác biệt chút nào so với cả hai không hoạt động chút nào. Điều duy nhất khác biệt là tên phần tử.

+0

có thể lặp lại http://stackoverflow.com/questions/15413468/deserializing-xml-with-datacontractserializer?rq=1 –

Trả lời

10

Tôi đã cố gắng làm cho nó hoạt động bằng cách cập nhật hợp đồng dữ liệu. Một cái gì đó để làm với thứ tự. Khi tôi làm cho Uri một tài sản cần thiết nó ném một ngoại lệ, vì vậy nó có thể là một cái gì đó để làm với thứ tự tải.

[DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")] 
    public class TestInfo 
    { 
     public TestInfo() { } 
     public TestInfo(Uri uri, int userCount, int initialCount, int averageExecutionTime) 
     { 
      TestUri = uri; 
      UserCount = userCount; 
      InitialCount = initialCount; 
      AverageExecutionTime = averageExecutionTime; 
     } 
     [DataMember(Name = "TestURL", IsRequired=true, Order=1)] 
     public Uri TestUri { get; private set; } 

     [DataMember(Name = "UserCount", IsRequired=true, Order=2)] 
     public int UserCount { get; private set; } 

     [DataMember(Name = "InitialCount", IsRequired=true, Order=3)] 
     public int InitialCount { get; private set; } 

     [DataMember(Name = "AverageExecutionTime", IsRequired=true, Order=4)] 
     public int AverageExecutionTime { get; private set; } 
    } 
+0

Bạn có bất cứ ý tưởng tại sao nó không hoạt động mà không cần 'Order'/'IsRequired' ? – MarcinJuraszek

+1

@MarcinJuraszek Tôi đã thực hiện hai thử nghiệm, Đã xóa tất cả thuộc tính IsRequired and Order và thay đổi xml đầu vào thành thứ tự bảng chữ cái. * đã làm việc * Đã xóa IsRequired và giữ nguyên thứ tự. * làm việc * Dường như trình tuần tự đang sử dụng lớp học của bạn để đọc tài liệu. Nếu bạn không chỉ định thứ tự, nó không biết tìm kiếm các phần tử theo đúng trình tự. Theo mặc định, chuỗi được sử dụng là chữ cái. –

+4

@MarcinJuraszek Các 'DataContractSerializer' sử dụng/mong đợi một thứ tự nghiêm ngặt của các yếu tố trong XML cho mỗi tài liệu [ở đây] (http://msdn.microsoft.com/en-us/library/ms729813.aspx). Nếu các phần tử XML của bạn sẽ không xuất hiện theo thứ tự mặc định cho mỗi quy tắc, thì bạn cần xác định thứ tự trong thuộc tính '[DataMember]' như được hiển thị trong câu trả lời của Patrick. –

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