在您提到反序列化过程之前,Keith 已经回答了您的问题。
至于序列化/反序列化
我怀疑是否有可能获得原始对象。我不知道 PowerShell 使用什么类型的序列化,但是如果您考虑简单的 Xml 序列化,那么您可以意识到您只能序列化属性而不能序列化其他任何东西。
您不能序列化其方法的主体。
您不能序列化所有事件的订阅者(或者在某些情况下可能会,但我不是这样的 .NET 专家)。
并且由于类型(如我的示例)可能不可用(例如,程序集仅存在于远程计算机上),因此需要传输所有类型信息。
它不仅与类型有关,还与对象实现的所有继承层次结构和接口有关。它们也会以某种方式被序列化。
试试这个例子:
$deserialized = Start-Job {
Add-Type -TypeDefinition @"
public class Parent {
public override string ToString() { return "overriden parent"; }
public int IntParent { get { return 1; } }
}
public class TestClass : Parent
{
public string GString() { return "this is a test string"; }
public override string ToString() { return "overriden tostring" + System.DateTime.Now.ToString(); }
public int IntProp { get { return 3451; } }
}
"@
New-Object TestClass
} | Wait-Job | Receive-Job
$deserialized.ToString()
$deserialized | gm -for
你会看到,那个 PowerShell
- 扁平化继承层次结构。
- 仅“实现”属性
- 并且因为它知道 的值
ToString()
,所以它也可以添加方法的结果。但是正如您所看到的,返回的信息ToString()
不再反映日期更改 - 它是冻结值。
我看不出远程处理的序列化、clixml 的序列化(通过Export-CliXml
)或Receive-Job
考虑我上面写的内容时有什么区别,所以我认为在这两种情况下都是不可能的。