Сериализация и десериализация удаленного взаимодействия PowerShell

доступны ли процедуры сериализации и десериализации объектов из PowerShell (как это выполняется удаленным удалением PowerShell)?

Я хотел бы избежать необходимости записывать объекты на диск (с Export-CliXML) и читать его обратно с (Import-CliXML).

в основном, я хочу получить пакеты свойств, которые создает десериализация, чтобы я мог добавить их в кэш объектов AppFabric. В противном случае AppFabric пытается использовать сериализацию .NET, которая завершается неудачей количество стандартных типов объектов.

возможно, через переменные $host или $executioncontext?

2 ответов


Они опубликовали спецификацию удаленного взаимодействия PowerShell, которая даст вам спецификацию, но исходный код, который они использовали для ее реализации, в настоящее время не является общедоступным. http://msdn.microsoft.com/en-us/library/dd357801 (PROT.10).aspx


О, я вижу, что вы спрашиваете, вы ищете ConvertTo-CliXml, похожий на то, как ConvertTo-Csv работает вместо Export-Csv. На первый взгляд кажется, что вы пытаетесь полностью избежать CliXml.

в этом случае есть один на PoshCode:ConvertTo-CliXml ConvertFrom-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()
    }
}