2017-07-15 14 views
-1

私はこの問題に悩まされています。私はどこでも答えを探していますが、私の問題に合ったものは見つかりませんでした。オブジェクトをシリアライズしてバイナリファイルに保存したい場合、deserializeをリストとして複数のレコード行を返すので、それをリストとして使用したいと思います。オブジェクトをシリアライズしてリストとしてデシリアライズします<object> C#

だから、これは私のクラス

[Serializable] 
public class DTOMultiConfig 
{ 
    public string Key { get; set; } 
    public string KeyValue { get; set; } 
} 

[Serializable] 
public class DTOMultiConfigs : List<DTOMultiConfig> 
{ 
    public void Dispose() 
    { 
    } 
} 

だと私は私がオンラインで見つけるこれらのメソッドを使用しています。これは私が私のオブジェクトをシリアル化する方法、この部分は、私はそれがで働いていないので、私はそれを間違った方法をやっていると確信している、わからないんだけど、これは私がdeserializeメソッドを使用する方法である

public void Editor_Config(DTOMultiConfig dto) 
{ 
    if (dto.ID == 0)//new 
    { 
     dto.ID = 0; 
     WriteToBinaryFile(BinPath, dto, true); 
    } 
    else//edit 
    { 
    } 
} 

public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false) 
{ 
    using (Stream stream = System.IO.File.Open(filePath, append ? FileMode.Append : FileMode.Create)) 
    { 
     var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     binaryFormatter.Serialize(stream, objectToWrite); 
    } 
} 

作品ですすべて。 ReadFromBinaryFileは 'return'ステートメントの直前で動作しなくなります。

public PartialViewResult ShowListOfConfigs() 
{ 
    List<DTOMultiConfig> dto = new List<DTOMultiConfig>(); 

    //DESERIALIZE 

    dto = ReadFromBinaryFile<List<DTOMultiConfig>>(BinPath); 
    return PartialView("_ListOfConfigs", dto); 
} 

public static T ReadFromBinaryFile<T>(string filePath) 
{ 
    using (Stream stream = System.IO.File.Open(filePath, FileMode.Open)) 
    { 
     var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     return (T)binaryFormatter.Deserialize(stream); 
    } 
} 

何らかの説明があれば、どんな答えでも分かります。

+0

例外はありますか?あなたの問題は、単一のDTOMultiConfigインスタンスを作成するが、あなたのタイプの単一インスタンスのバイナリ表現がリストのバイナリ表現と異なるために動作できないList を読み込もうとしていると思われる。 – dnickless

+0

こんにちは、応答ありがとう、私はこのexeptionを取得しています{"'MVCHowTo.Models.DTOMultiConfig' '[MVCHowTo.Models.DTOMultiConfig]'をタイプする 'MVCHowTo.Models.DTOMultiConfig'オブジェクトを 'System.Collections.Generic.List'1にキャストすることができません。 "} –

+0

バイナリファイルにも書き込むときにdtoMultiConfigをリストにする必要がありますか?一度に1レコードしか書いていないので、 –

答えて

0

私は説明しようとしましょう。バイナリシリアライザではなく、XMLシリアライザを使用していたとします。この場合、あなたが書いているはずだ、何がこのような種類のになります。

<DTOMultiConfig> 
    <Key>SomeKey</Key> 
    <Value>SomeValue</Value> 
</DTOMultiConfig> 

を今、あなたが戻ってあなたのデータを読み取るとき、あなたは、しかし、する必要があります一覧にあなたの単一のインスタンスをデシリアライズしようとしています次のように少し見えます。

<ListOfDTOMultiConfigs> 
    <DTOMultiConfig> 
    <Key>SomeKey</Key> 
    <Value>SomeValue</Value> 
    </DTOMultiConfig> 
    [...potentially more elements here...] 
</ListOfDTOMultiConfigs> 

これは単純に機能しません。バイナリの世界では、ファイル内の実際のデータは異なって見えます。しかし、同じ問題が続く。構造が完全に同一でない限り、1つのタイプを書き込んで別のタイプを読み取ることはできません。

具体的なケースに対処するには、リストが必要な場合は、単一の要素を読み込んでリストに入れることができます。または、あなたのファイルに単一の要素を持つリストを書き込んだ後、上記のコードを使ってそのリストを読み戻すことができます。

EDIT:あなたの上記のコメントで

は、ファイルに二回、単一の要素を書くことがあなたのリストを与える必要があることを期待したいと言います。二回単一の要素を書き、上記の私の例に戻って行くことはあなたを与えるだろう、この:

<DTOMultiConfig> 
    <Key>SomeKey</Key> 
    <Value>SomeValue</Value> 
</DTOMultiConfig> 
<DTOMultiConfig> 
    <Key>SomeKey</Key> 
    <Value>SomeValue</Value> 
</DTOMultiConfig> 

あなたは、彼らが同一ではないことがわかりますので、することはできません上記のあなたは、リストの表現のための私の例にこれを比較した場合交換可能に使用される。

+0

さて、私はそれをリストとして書こうとしますが、私はあなたに知らせます。ありがとう! –

+0

ええ、実際にファイルを2回書きましたが、1つのレコードしか返さない –

+0

これは私の更新コードです:List _dto = new List (); _dto.Add(dto); WriteToBinaryFile(BinPath、_dto、true); –

関連する問題