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