2011-02-09 6 views
7

を取得して一覧 をシリアライズ私は現在、リストをシリアル化しようとしています、それは(私は罰金だと思う)シリアル化し、それが逆シリアル化するとき、コードの量のために申し訳ありません DataContractSerializerがエラー

が、私は本当に立ち往生午前なしていなぜこれが起きているのか、私は構造体をクラスに変更しようとしました。

THANKS。

私は、次のエラーは私が

を更新しました。こののようにデシリアライズしています

 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(); 
       } 
      } 

を更新しました。こののようにシリアライズしています

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.` 

を更新されますあなたは完全にオブジェクトを直列化されていないためですの

プロパティ

private byte[] _serializedData; 

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

ヘルパーメソッド

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(); 
    } 
} 

構造体

[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; 
    } 
} 

答えて

1

私はサンプルがXmlDictionaryReaderを削除し、代わりに直接DataContractSerializerに入力/出力ストリームを供給することにより、仕事を得ることができます。大きな圧縮されたコレクションのXmlDictionaryReaderの不具合かもしれませんが、わかりません。

希望はこのことができます:

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

を参照してください。これは、XmlDictionaryReader – Kev84

5

。特にgzipを使用している場合は、記述後にストリームを閉じる必要があります。お勧めは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

ありがとうございますが、私はまだこのエラーが発生しています: 'タイプSystem.Collections.Generic.List'1 [[ABCDataValues、AB、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null]]。予期しないファイルの終わり。以下の要素は閉じられません:Time、DataValues、ArrayOfDataValues。 ' 更新されたコード – Kev84

2

申し訳ありませんが、この質問に遅刻します。

最初のアプローチで問題があったのは、単にXmlDictionaryWriterをフラッシュしていない(読み込み:廃棄していない)ということでした。これは、誰かを助け

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

希望:

これは動作するはず

(句を使用して第二の点に注意してください)。

0

私はまったく同じ問題に遭遇し、最終的に解決策を見つけました。書き込みしようとしているストリーム自体が閉じられる前に、XmlDictionaryWriterを破棄して閉じる必要があります。私は、http://www.albahari.com/nutshell/ch15.aspxにある徹底した例のおかげで、MSDNのものよりも完全であることを発見しました。あなたのサンプルコードで

は、それは次のようになります。私自身の例で

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

、代わりのXmlDictionaryWriterを使用して、プレーンとデフォルトのXMLライターによっては、私だけのファイルサイズは〜25%の減少を与えたが、オブジェクトを読み戻すときは第3因子。

関連する問題