2011-10-02 36 views
4

比方说一个由 编译的代码串在内存中创建的(可执行)组件。然后我想将这个程序集 对象序列化成一个字节数组,然后将其存储在数据库中。然后在 后面我想从数据库中检索字节数组,并将字节数组反序列化回一个汇编对象,然后调用汇编的条目 。如何序列化/反序列的组件对象,并从一个字节数组

起初我只是想做到这一点系列化像我任何其他简单的对象在.NET中,但显然不会与装配对象工作。程序集对象包含一个称为GetObjectData的方法,它获取重新实例化程序集所需的序列化数据。所以我有点困惑,我是如何将所有这些放在一起的。

答案只需要说明如何采取装配对象,将其转换为字节数组转换回成一个程序集,然后在反序列化的组件执行的输入方法。

回答

3

一种组件更方便简单地表示为二进制DLL文件。如果你想到那样,其余的问题就会消失。具体来说,看看Assembly.Load(byte[])加载Assembly二进制。以写为二进制,使用CompileAssemblyFromSource并查看结果的PathToAssembly - 然后File.ReadAllBytes(path)从文件中获取二进制文件。

+0

但是如果你完全在内存中完成编译呢? – Beaker

+0

@Beaker那么这是一个痛苦; p我没有立即回答那里,除了“编译到临时文件夹会更容易” –

+0

如果没有人在一周内出现内存答案然后我将标记这个答案。 – Beaker

1

System.Reflection.AssemblyISerializable并且可以简单地进行序列化,像这样:

Assembly asm = Assembly.GetExecutingAssembly(); 
BinaryFormatter formatter = new BinaryFormatter(); 
MemoryStream stream = new MemoryStream(); 
formatter.Serialize(stream, asm); 

和反序列化也很简单,但调用BinaryFormatter.Deserialize来代替。

+2

反序列化它不会产生相同的程序集......换句话说,您创建的内存流的大小不等于程序集文件的大小。 –

+1

@TonoNam可能不是,但他们特别询问如何序列化对象,这将做什么。这并不一定意味着它将成为程序员的期望。虽然我想测试和验证你的陈述,但我认为它应该产生一个功能完全相同的程序集。 –

+0

System.Reflection.Assembly实现System.Runtime.Serialization.ISerializable接口,并在其GetObjectData方法中序列化其FullName属性。反序列化时,它从FullName加载程序集,因此它在为已知用于appdomain的程序集序列化和反序列化时有效,但它不是“序列化程序集解决方案”.http://referencesource.microsoft.com/#mscorlib/system/reflection/assembly。 CS,1588 – mehyaa

相关问题