2013-01-31 67 views
0

我在获取SOAP服务以反序列化对象数组时遇到问题;它在数组的第一个成员中唯一的读数而没有其他值。这里是我的代码:使用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(); 
    } 

我写了一个简单的单元测试,增加了两个证书对象的文件,输出看起来正确的,证书的两组都存在,但是当我运行测试增加第三组到文件中,soap.Deserialize(stream)行只返回一个只有一个条目的数组,即使它读取的文件包含两个条目。我在这里做错了什么?有没有更好/更简单的方法来做到这一点?请帮忙!

+0

,你为什么和SOAPformatter玩?为什么不使用WCF,它会为你做序列化? –

+0

它是一个学校的东西... – peter9464

+0

为什么你的学校让你做愚蠢的事情? –

回答

0

我想通了。问题在于FileStream的FileMode.OpenOrCreate属性。这将打开文件,但附加一个新的集合,而不是更改原始集合。我需要重写使用FileMode.Create不是文件,所以这里是工作的代码(我也改变了收集到一个Hashtable,它工作得更好):

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