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()
は日付の変更が反映されていません。これは値が固定されているためです。
Export-CliXml
リモーティング用のシリアル化、clixml へのシリアル化 (経由)、またはReceive-Job
上で書いたことを考えると違いがわかりませんので、どちらの場合も不可能だと思います。