使用 SOAP 反序列化数组

本文关键字:数组 反序列化 SOAP 使用 | 更新日期: 2023-09-27 17:56:48

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

我编写了一个简单的单元测试,它将两个 Credentials 对象添加到文件中,输出看起来正确,两组凭据都存在,但是当我运行测试向文件添加第三组时,肥皂。反序列化(流) 行返回一个只有一个条目的数组,即使其读取的文件包含两个条目。我在这里做错了什么吗?有没有更好/更简单的方法可以做到这一点?请帮忙!

使用 SOAP 反序列化数组

我想通了。问题出在 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();
    }