13

PowerShell ランタイムをホストする場合、PSObject何らかの方法で元の型に戻すことはできますか?

例えば:

WriteObjectパイプラインで ClassXzy のコレクションを呼び出してプッシュするコマンドレットがあります。PowerShell.Invokeホスト側から呼び出すPSObjectと、BaseObjectプロパティを持つ のコレクションを取得します。へのキャストBaseObjectClassXyz失敗します。

各プロパティ値を対応する元のオブジェクトにマッピングする方法はありますか? s をコマンドレットに渡すことができ、それらが Parameter 型に変換されるため、
PowerShell が何らかの方法でこれを行うと想定しています。PSObjectしかし、どのように?

私は Reflector を使用して PS アセンブリを引き裂くのに時間を費やしましたが、この魔法がどのように発生するかを本当に突き止めていませんでした。

何か案は?

編集:非常に重要な詳細を1つ忘れていました。PSObject私がテストしているのはリモートオブジェクトであるため、タイプBaseObjectの名前はDeserialized.ClassXyz. これが、このような奇妙な動作が見られる理由です。

4

3 に答える 3

10

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上で書いたことを考えると違いがわかりませんので、どちらの場合も不可能だと思います。

于 2010-02-25T05:37:35.367 に答える
4

BaseObjectプロパティ on PSObject(実際のベース オブジェクトに到達するまで各 PSObject をウォークする) またはImmediateBaseObjectチェーン内の次のオブジェクトを取得するプロパティのいずれかにアクセスできます。

于 2010-02-25T00:59:57.597 に答える
0

上記のことを実行できますが、プロキシ オブジェクトにアクセスするため、PSRemoting が開始されると、これらのメソッドはすべて機能しなくなります。PSMembers と PSProperties を使用するのがベスト プラクティスです。

于 2011-12-23T15:52:58.147 に答える