0

オブジェクトの配列を逆シリアル化するためのSOAPサービスの取得に問題があります。配列の最初のメンバーでの唯一の読み取りであり、他には何もありません。これが私のコードです:

public void StoreCredentials(Credentials credentials)
    {
        Credentials[] credsArray;
        var soap = new SoapFormatter();

        var stream = new FileStream(_path, FileMode.OpenOrCreate);
        try
        {
            credsArray = (Credentials[])soap.Deserialize(stream);
            var credsList = credsArray.ToList();
            credsList.Add(credentials);
            credsArray = credsList.ToArray();
        }
        catch (SerializationException)
        {
            credsArray = new[] {credentials};
        }
        soap.Serialize(stream, credsArray);
        stream.Close();
    }

2つのクレデンシャルオブジェクトをファイルに追加する簡単な単体テストを作成しました。出力は正しく見え、両方のクレデンシャルセットが存在しますが、テストを実行して3番目のセットをファイルに追加するとsoap.Deserialize(stream)行読み取り元のファイルに2つのエントリが含まれている場合でも、エントリが1つしかない配列を返します。私はここで何か間違ったことをしていますか?これを行うためのより良い/より簡単な方法はありますか?助けてください!

4

1 に答える 1

0

私はそれを考え出した。問題は、FileStreamのFileMode.OpenOrCreate属性にあります。これによりファイルが開きますが、元のコレクションを変更する代わりに、新しいコレクションを追加します。代わりにFileMode.Createを使用してファイルを上書きする必要があったので、ここに動作するコードがあります(コレクションをハッシュテーブルに変更しました。これはより適切に動作します)。

public void StoreCredentials(Credentials credentials)
    {
        credentials.Encrypt(_myUser.Encryption);
        Hashtable credsTable;
        var soap = new SoapFormatter();

        FileStream stream;
        try
        {
            stream = new FileStream(_path, FileMode.Open, FileAccess.ReadWrite);
            credsTable = (Hashtable) soap.Deserialize(stream);
            stream.Close();
            stream = new FileStream(_path, FileMode.Create, FileAccess.ReadWrite);
            if (credsTable.ContainsKey(credentials.Id))
                credsTable[credentials.Id] = credentials;
            else
                credsTable.Add(credentials.Id, credentials);
        }
        catch (FileNotFoundException e)
        {
            stream = new FileStream(_path, FileMode.Create, FileAccess.ReadWrite);
            credsTable = new Hashtable {{credentials.Id, credentials}};
        }
        soap.Serialize(stream, credsTable);
        stream.Close();
    }
于 2013-01-31T23:20:30.480 に答える