2010-04-23 25 views
0
// TestASettingsString and TestBSettingsString are byte[] 
// TestASettings and TestBSettings are two objects to be saved 

在SettingsSaving,TestASettings和TestBSettings序列化爲兩個不同的字節數組,然後保存(在某些其他功能)如何通過applicationsettingsbase重新加載不同的對象?

我的問題是如何在loadsavedsettings恢復TestASettings和TestBSettings從TestASettingsString和TestASettingsString seperately?

那就是當我做 formatter.Deserialize(stream);

如何分離兩個完全不同的對象來自formatter.Deserialize(stream)的TestASettings和TestBSettings?

感謝

private void SettingsSaving(object sender, CancelEventArgs e) 
    { 

     try 
     { 
      var stream = new MemoryStream(); 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(stream, TestASettings); 
    // TestASettingsString and TestBSettingsString are byte[] 
      TestASettingsString = stream.ToArray(); 

      stream.Flush(); 
      formatter.Serialize(stream, TestBSettings); 
      TestBSettingsString = stream.ToArray(); 

      stream.Close(); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
     } 
    } 





private void LoadSavedSettings() 
    { 
     Reload(); 
     // how to get TestASettings and TestBSettings from TestASettingsString and 
     // TestASettingsString seperately? 
    } 

回答

1

我懷疑是問題的一部分是在這裏:

 TestASettingsString = stream.ToArray(); 
     stream.Flush(); 
     formatter.Serialize(stream, TestBSettings); 
     TestBSettingsString = stream.ToArray(); 

MemoryStreamFlush()是一個空操作。你實際上意味着:

 TestASettingsString = stream.ToArray(); 
     stream.SetLength(0); 
     formatter.Serialize(stream, TestBSettings); 
     TestBSettingsString = stream.ToArray(); 

這將重置流,給TestBSettingsString作爲數據單獨塊?目前TestBSettingsString實際上包含TestASettingsTestBSettings

做完這些,它應該只是倒車東西的情況下:

using(MemoryStream ms = new MemoryStream(TestASettingsString)) { 
    BinaryFormatter bf = new BinaryFormatter(); 
    TestASettings = (WhateverType)bf.Deserialize(ms); 
} 
using(MemoryStream ms = new MemoryStream(TestBSettingsString)) { 
    BinaryFormatter bf = new BinaryFormatter(); 
    TestBSettings = (WhateverOtherType)bf.Deserialize(ms); 
} 

還請注意:我使用BinaryFormatter任何離線堅持的東西(磁盤,數據庫等)提出

+0

@younevertell - 您是否添加了「SetLength(0)」? – 2010-04-23 18:00:07

+0

非常感謝,Marc。它現在有效 – user302933 2010-04-23 19:23:46

+0

但stream.SetLength(0);不起作用。我關閉了流,並得到一個新的 – user302933 2010-04-23 19:25:07

1

反序列化他們需要這樣的代碼:

var ms = new MemoryStream(TestASettingsString); 
var fmt = new BinaryFormatter(); 
TestASettings = (TestAClass)fmt.Deserialize(ms); 

哪裏TestAClass是TestASettings的類型。您需要重置序列化代碼中的流,將位置設置爲0.

相關問題