从 PowerShell 对象生成 CLIXML 字符串,无需先序列化到磁盘

Ben*_*est 3 powershell serialization powershell-core

我有以下代码,它将一个对象导出到 XML 文件,然后将其读回并打印在信息流上。

try{
  # Sample object
  $Person = @{
    Name = 'Bender'
    Age  = 'At least 1074'
  }
  $Person | Export-CliXml obj.xml
  
  $cliXml = Get-Content -Raw ./obj.xml
  Write-Host $cliXml
} finally {
  if( Test-Path ./obj.xml ) {
    Remove-Item -Force ./obj.xml -EV rError -EA SilentlyContinue
    if( $rError ) {
      Write-Warning "Failed to remove ./obj.xml: $($rError.Exception.Message)"
    }
    Remove-Variable -Force $rError -EA Continue
  }
}
Run Code Online (Sandbox Code Playgroud)

有一个系统本地父会话,它监视其 STDOUT 以获取此输出,并将其重建为自己会话中的对象。

注意:我知道本地PSRemoting会话可以工作,但我需要它也可以在尚未配置或不会配置PSRemoting的系统上工作。

我想去掉中间人,而不是将对象写入磁盘。不幸的是,
Import-CliXMlExport-CliXml是名称中唯一带有 和 的 cmdlet CliXml,到目前为止,进行一些 .NET 文档调查还没有发现任何结果。

有没有一种方法可以简单地将对象序列化为 CliXml 字符串,而无需先写入磁盘?我考虑过使用,$Person | ConvertTo-Json -Compress -Depth 100但这有两个问题:

  1. 仅捕获最多 100 层的嵌套对象。这是一个边缘情况,但仍然是我想避免的限制。我总是可以使用另一个库或其他格式,但是;

  2. 我希望将它们重建为与序列化之前相同类型的 .NET 对象。使用 CliXml 重新创建对象是我知道可以做到这一点的唯一方法。

Mat*_*sen 10

[PSSerializer]CliXml 序列化器通过类公开:

$Person = @{
  Name = 'Bender'
  Age  = 'At least 1074'
}

# produces the same XML ouput as `Export-CliXml $Person`
[System.Management.Automation.PSSerializer]::Serialize($Person)
Run Code Online (Sandbox Code Playgroud)

要反序列化 CliXml,请使用以下Deserialize方法:

$cliXml = [System.Management.Automation.PSSerializer]::Serialize($Person)

$deserializedPerson = [System.Management.Automation.PSSerializer]::Deserialize($cliXml)
Run Code Online (Sandbox Code Playgroud)