2011-02-09 27 views
7

Tôi hiện đang cố gắng để serialize một List, nó serializes (Tôi nghĩ tốt), nhưng khi nó deserialize,DataContractSerializer serializing Danh sách <T> nhận được lỗi

Xin lỗi vì số lượng mã, nhưng tôi thực sự bị mắc kẹt và không có ý tưởng tại sao điều này xảy ra, tôi cũng đã cố gắng thay đổi cấu trúc thành một lớp và không giúp đỡ.

THANKS.

tôi nhận được lỗi sau CẬP NHẬT

There was an error deserializing the object of type There was an error deserializing the object of type 
`System.Collections.Generic.List`1[[A.B.C.DataValues, A.V, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. Unexpected end of file. Following elements are not closed: Time, DataValues, ArrayOfDataValues.` 

Tôi serializing như thế này CẬP NHẬT

 public void SerializeDataValue(List<DataValues> values) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataValues>)); 

       using (MemoryStream stream = new MemoryStream()) 
       { 
        using (GZipStream compress = new GZipStream(stream, CompressionMode.Compress)) 
        { 
         XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter(compress); 
         serializer.WriteObject(w, values); 

        } 
        _serializedData = stream.ToArray(); 
       } 
      } 

Tôi deserializing như này UPDATED

public List<DataValues> DeserializeDataValue() 
{ 
    if (SerializedData == null || SerializedData.Length == 0) 
    { 
     return new List<DataValues>(); 
    } 
    else 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataValues>)); 
     using (MemoryStream stream = new MemoryStream(SerializedData)) 
     { 
      using (GZipStream decompress = new GZipStream(stream, CompressionMode.Decompress)) 
      { 
       XmlDictionaryReader r = XmlDictionaryReader.CreateBinaryReader(decompress, XmlDictionaryReaderQuotas.Max); 
       return serializer.ReadObject(r, true) as List<DataValues>; 
      } 
     } 
    } 
} 

Thuộc tính

private byte[] _serializedData; 

[DataMember] 
[Browsable(false)] 
public byte[] SerializedData 
{ 
    get { return _serializedData; } 
    set { _serializedData = value; } 
} 

Phương pháp helper

public static byte[] ReadFully(Stream input) 
{ 
    byte[] buffer = new byte[16 * 1024]; 
    input.Position = 0; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 

Struct

[DataContract(Name = "DataValues", Namespace = "A.B.C")] 
public struct DataValues 
{ 
    [DataMember] 
    public DateTime Time { get; set; } 
    [DataMember] 
    public Single Value { get; set; } 

    public DataValues(DateTime dateTime, Single value) 
    { 
     Time = dateTime; 
     Value = value; 
    } 
} 

Trả lời

1

Tôi có thể lấy mẫu để làm việc bằng cách loại bỏ và thay vào đó XmlDictionaryReader trực tiếp nuôi dưỡng các dòng đầu vào/đầu ra vào DataContractSerializer. Nó có thể là một khiếm khuyết trong XmlDictionaryReader cho các bộ sưu tập nén lớn nhưng tôi không chắc chắn.

Hope this helps:

public void SerializeDataValue(List<DataValues> values) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataValues>)); 
        using (MemoryStream stream = new MemoryStream()) 
       { 
        using (GZipStream compress = new GZipStream(stream, CompressionMode.Compress)) 
        { 
         serializer.WriteObject(compress , values); 

        } 
        _serializedData = stream.ToArray(); 
       } 
      } 

    public List<DataValues> DeserializeDataValue() 
    { 
     if (SerializedData == null || SerializedData.Length == 0) 
     { 
      return new List<DataValues>(); 
     } 
     else 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataValues>)); 
      using (MemoryStream stream = new MemoryStream(SerializedData)) 
      { 
       using (GZipStream decompress = new GZipStream(stream, CompressionMode.Decompress)) 
       { 
        return serializer.ReadObject(decompress , true) as List<DataValues>; 
       } 
      } 
     } 
    } 
+0

cảm ơn, đã hoạt động sau khi tôi loại bỏ XmlDictionaryReader – Kev84

5

Đó là bởi vì bạn không serialising đối tượng (s) hoàn toàn. Bạn cần đóng (các) luồng sau khi viết, đặc biệt khi sử dụng gzip. Mục ðích thực tế là sử dụng using:

public void SerializeDataValue(List<DataValues> values) 
{ 
    DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataValues>)); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     using (GZipStream compress = new GZipStream(stream, CompressionMode.Compress)) 
     { 
      XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter(compress); 
      serializer.WriteObject(w, values); 
     } 
     _serializedData = stream.ToArray(); 
    } 
} 
+0

Cảm ơn, nhưng tôi vẫn nhận được lỗi này: 'Đã xảy ra lỗi khi deserializing đối tượng thuộc loại System.Collections.Generic.List'1 [[ABCDataValues, AB, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]]. Kết thúc tệp không mong đợi. Các phần tử sau không được đóng: Thời gian, DataValues, ArrayOfDataValues. ' Vui lòng xem mã cập nhật – Kev84

2

Xin lỗi bị trễ cho câu hỏi này.

Vấn đề với phương pháp tiếp cận ban đầu đơn giản là bạn đã không xả (đọc: xử lý) XmlDictionaryWriter.

này nên làm việc (lưu ý thứ 2 sử dụng khoản):

using (GZipStream compress = new GZipStream(stream, CompressionMode.Compress)) 
using (XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter(compress)) 
{ 
    serializer.WriteObject(w, values); 
} 

Hope this helps một ai đó.

0

Tôi đã chạy chính xác vào cùng một vấn đề và cuối cùng tôi đã tìm thấy giải pháp: XmlDictionaryWriter cần phải được xử lý/đóng trước khi Luồng bạn viết vào chính nó đã đóng. Tôi phát hiện ra rằng nhờ vào ví dụ kỹ lưỡng được tìm thấy tại http://www.albahari.com/nutshell/ch15.aspx thate là đầy đủ hơn so với những MSDN.

Trong mã mẫu của bạn, đó sẽ là:

  using (XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter(compress)) 
      { 
       serializer.WriteObject(w, values); 
      } 

On dụ của riêng tôi, bằng cách sử dụng XmlDictionaryWriter thay vì vùng đồng bằng và của nhà văn Xml mặc định chỉ cho tôi một giảm ~ 25% kích thước tập tin, nhưng một yếu tố 3 khi đọc lại đối tượng.

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