2011-04-11 39 views
6

是否可以使用PowerShell序列化和反序列化對象(如由PowerShell遠程處理執行)的例程?PowerShell遠程序列化和反序列化

我想避免必須將對象寫入磁盤(使用Export-CliXML)並用(Import-CliXML)重新讀取它。

基本上,我想獲取反序列化創建的屬性包,以便我可以將它們添加到AppFabric對象緩存中。否則,AppFabric會嘗試使用.NET序列化,該序列化對於許多標準對象類型而言失敗。

也許通過$ host或$ executioncontext變量?

+0

你讀過[對象序列化指令](http://blogs.msdn.com/b/powershell/archive/2007/05/01/object-serialization-directives.aspx)和[如何將對象發送到遠程會話和從遠程會話發送](http:/ /blogs.msdn.com/b/powershell/archive/2010/01/07/how-objects-are-sent-to-and-from-remote-sessions.aspx)來自Jeffrey Snover。我不確定它是否給你提供瞭解決方案,但也許是一個線索。 – JPBlanc 2011-04-11 13:51:37

+0

謝謝@JBBlanc。我讀過這些帖子,當他們告訴我發生了什麼事情時,我希望不必重新發明實施它的輪子。 – 2011-04-11 14:21:22

+0

@Steve,你可以更具體一點關於你在嘗試什麼去完成? – 2011-04-11 16:01:10

回答

1

哦,我明白你在問什麼,你正在尋找一個ConvertTo-CliXml,類似於ConvertTo-Csv如何代替Export-Csv。乍一看,這聽起來像你試圖完全避開CliXml。

在這種情況下,有一個上PoshCode:ConvertTo-CliXmlConvertFrom-CliXml

這裏有一個完整副本,給你一個想法(我沒有檢查這個的正確性):

function ConvertTo-CliXml { 
    param(
     [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] 
     [ValidateNotNullOrEmpty()] 
     [PSObject[]]$InputObject 
    ) 
    begin { 
     $type = [PSObject].Assembly.GetType('System.Management.Automation.Serializer') 
     $ctor = $type.GetConstructor('instance,nonpublic', $null, @([System.Xml.XmlWriter]), $null) 
     $sw = New-Object System.IO.StringWriter 
     $xw = New-Object System.Xml.XmlTextWriter $sw 
     $serializer = $ctor.Invoke($xw) 
     $method = $type.GetMethod('Serialize', 'nonpublic,instance', $null, [type[]]@([object]), $null) 
     $done = $type.GetMethod('Done', [System.Reflection.BindingFlags]'nonpublic,instance') 
    } 
    process { 
     try { 
      [void]$method.Invoke($serializer, $InputObject) 
     } catch { 
      Write-Warning "Could not serialize $($InputObject.GetType()): $_" 
     } 
    } 
    end {  
     [void]$done.Invoke($serializer, @()) 
     $sw.ToString() 
     $xw.Close() 
     $sw.Dispose() 
    } 
}