我編寫了一個插件系統,並且我想保存/加載它們的屬性,以便在程序重新啓動時它們可以繼續工作。我使用二進制序列化。問題是他們可以被序列化但不是反序列化。 在反序列化期間「無法找到程序集」異常被拋出。我怎樣才能恢復序列化的數據?在C中對外部程序集進行序列化和反序列化#
2
A
回答
4
確定這裏我找到了一些東西。 :)
http://techdigger.wordpress.com/2007/12/22/deserializing-data-into-a-dynamically-loaded-assembly/
我用這種方法,它的工作沒有任何問題。
杉杉定義粘合劑類:
internal sealed class VersionConfigToNamespaceAssemblyObjectBinder : SerializationBinder {
public override Type BindToType(string assemblyName, string typeName) {
Type typeToDeserialize = null;
try{
string ToAssemblyName = assemblyName.Split(',')[0];
Assembly[] Assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ass in Assemblies){
if (ass.FullName.Split(',')[0] == ToAssemblyName){
typeToDeserialize = ass.GetType(typeName);
break;
}
}
}
catch (System.Exception exception){
throw exception;
}
return typeToDeserialize;
}
}
然後序列化方法:
public static byte[] Serialize(Object o){
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat
= System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
formatter.Serialize(stream, o);
return stream.ToArray();
}
public static Object BinaryDeSerialize(byte[] bytes){
MemoryStream stream = new MemoryStream(bytes);
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat
= System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
formatter.Binder
= new VersionConfigToNamespaceAssemblyObjectBinder();
Object obj = (Object)formatter.Deserialize(stream);
return obj;
}
我使用他們,我需要。
protected void SaveAsBinary(object objGraph, string fileName)
{
byte[] serializedData = Serialize(objGraph);
File.WriteAllBytes(fileName, serializedData);
}
protected object LoadFomBinary(string fileName)
{
object objGraph = null;
try
{
objGraph = BinaryDeserialize(File.ReadAllBytes(fileName));
}
catch (FileNotFoundException fne)
{
#if DEBUG
throw fne;
#endif
}
return objGraph;
}
感謝您的幫助:)
2
1
很可能,在您反序列化數據時,您的插件程序集未加載。因爲它是一個外部的插件程序集,所以我猜你明確地加載了它。您可能在加載程序集之前反序列化屬性對象。您可以通過在當前的AppDomain上掛接AssemblyResolve和AssemblyLoad事件來診斷和修復問題,並在調用它們時精確地觀察它們。
您還可以使用AssemblyResolve通過自己放置顯式的Assembly加載代碼並返回加載的程序集來修復加載錯誤。我不建議這樣做,因爲它有些倒退。
+0
其實我加載程序集後調用反序列化。 – Heka 2010-05-25 07:12:49
相關問題
- 1. 在javascript中對數組進行序列化和反序列化
- 2. DataSerializable - 對二維數組進行序列化和反序列化
- 3. 使用循環對圖進行序列化和反序列化
- 4. 序列化和反序列化(C#)
- 5. C#Xml序列化和反序列化
- 6. 在C++中序列化和反序列化對象
- 7. 使用C#進行二進制Plist序列化/反序列化#
- 8. 如何在C#中執行序列化和反序列化?
- 9. 在C#和C++中序列化和反序列化
- 10. 二進制序列化/反序列化
- 11. 序列化 - 反序列化(二進制)
- 12. 部分xml序列化/反序列化
- 13. C#部分反序列化
- 14. C#部分反序列化和完全序列化
- 15. json.net在外部json文件上的序列化/反序列化
- 16. C# - 從流中對DES加密文件進行序列化/反序列化
- 17. 使用XMLSerializer進行序列化和反序列化的問題
- 18. boost C++序列化/反序列化
- 19. C#XML序列化/反序列化
- 20. Python序列化c#反序列化
- 21. C#XML序列化/反序列化
- 22. 反序列化序列化對象
- 23. C#反序列化對象
- 24. 在jQuery中序列化/反序列化
- 25. OpenCV:如何對MatND對象進行序列化和反序列化?
- 26. 在ruby中通過rabbitmq序列化和反序列化對象
- 27. 在Swift中自動JSON序列化和反序列化對象
- 28. 序列化外部對象
- 29. 序列化類型化數據集,更新程序集,反序列化錯誤
- 30. java序列化和反序列化
是否狀態,這集不會被發現? – Snake 2010-05-24 13:55:00
是的。我寫的一個插件。但是它已經加載了,那麼它如何序列化呢? – Heka 2010-05-24 13:57:34
我願意打賭,你的插件程序集並不是在反序列化時加載的。我知道你剛纔說過,但我會敦促你再看一遍。 – 2010-05-24 15:17:49