2010-04-14 66 views
1

我需要看看一个对象的属性,我不能在我的开发机器上以适当的状态实例化这个对象。我需要我的客户端在她的机器上运行一些代码,将有问题的对象序列化到磁盘,然后我可以分析该文件。我们如何序列化一个不是我们自己的自定义类的类?

这是我想要序列化的类。

System.Security.AccessControl.RegistrySecurity

这里是我的代码:

Private Sub SerializeRegSecurity(ByVal regKey As RegistryKey) 

    Try 

     Dim regSecurity As System.Security.AccessControl.RegistrySecurity = regKey.GetAccessControl() 

     Dim oXS As XmlSerializer = New XmlSerializer(GetType(System.Security.AccessControl.RegistrySecurity)) 
     Dim oStmW As StreamWriter 

     Dim regDebugFilePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "RegDebugFile.xml") 
     'Serialize object to XML and write it to XML file 
     oStmW = New StreamWriter(regDebugFilePath) 
     oXS.Serialize(oStmW, regSecurity) 
     oStmW.Close() 

    Catch ex As Exception 
     Console.WriteLine(ex.ToString) 
    End Try 

End Sub 

这里就是我在XML文件中结束:

<?xml version="1.0" encoding="utf-8"?> 

任何关于如何完成我想要做的事情的想法?我们如何序列化一个不是我们自己的自定义类的类?

感谢您的任何帮助。即使是一种替代方法。

+0

我想我会放弃这个问题。我不知道如何处理这个不属于我的课程。 – Doug 2010-04-19 15:04:33

回答

2

你有几种选择。这里有三个主要的:

你可以为你想要序列化的类编写一个包装类,然后序列化和反序列化包装器。在反序列化中,包装器将需要从其自己的数据重新构建序列化对象,并且您需要从包装器中提取重构对象。

另一种选择是实施Serialization Surrogate。您需要手动配置GetObjectData和SetObjectData方法,这些方法控制数据如何进出序列化对象。

如果您希望序列化的类是可继承的,并且您可以使用子类而不是原始类,则可以创建一个实现ISerializable的子类。与序列化代理一样,您必须自己处理GetObjectData

+0

这些选项看起来很有希望。但我没有想法如何开始实施这些。你有任何可能让我开始的代码示例的链接?谢谢!同时,我将开始使用谷歌搜索来查看是否可以找到一些样本来让我去。 – Doug 2010-04-14 17:50:04

+0

也许这MSDN文章将有所帮助:http://msdn.microsoft.com/en-us/magazine/cc188950.aspx 此外,请检查我的上述文章中的GetObjectData链接示例代码 – 2010-04-14 17:51:41

0

您可以尝试使用BinaryFormatterSerialize方法。这会将对象图形序列化为一个流,然后您可以根据需要坚持。

+0

谢谢,我尝试使用BinaryFormatter的Serialize方法,但我得到一个异常,指出System.Security.AccessControl.RegistrySecurity未标记为可序列化。 – Doug 2010-04-14 16:57:52

相关问题