反序列化的对象类型问题 - 特别是Powershell 5类和Import-CliXml

时间:2017-01-23 13:21:07

标签: powershell serialization deserialization xml-deserialization powershell-v5.0

使用Import-CliXml命令重新导入反序列化对象时,我遇到了Powershell 5类和对象类型的问题。

我有一个类型为Computer的对象,我希望将其存储为xml,然后在下次运行脚本时重新导入

/**
 * Page Load Spinner
 * - Add Spinner to DOM
 * - jQuery
 */
function pSpinner() {
    var timerDelay = 2500;
    var spinnerHtml = '<div class="pspinner"></div>';
    var spinnerSel = $('.pspinner');

    // Append HTML to body
    var appendSpinner = $('body').append(spinnerHtml);

    // Initiating setTimeout before showing spinner
    setTimeout(function () {
        $('.pspinner').css({ display: 'block' });
        $('.pspinner').animate({ opacity: 1.00 }, 150);
    }, timerDelay);

    // Remove spinner once DOM load completes
    //window.addEventListener('DOMContentLoaded', function () {
    window.addEventListener('load', function () {
        $('.pspinner').remove();
    });
}
$(document).ready(function(){ pSpinner(); });

我使用以下内容导出和导入对象:

class Computer 
{
    $Private:hostname
    $Private:ipAddress

    Computer([String] $hostname, [String] $ipAddress)
    {
        $this.hostname = $hostname
        $this.ipAddress = $ipAddress
    }
    static [Computer] reserialize([PSObject] $deserializedComputer)
    {
        return [Computer]::new($deserializedComputer.hostname, $deserializedComputer.ipAddress)
    }
}

我理解当重新导入这个对象时它被反序列化并且基本上只是一个数据容器(类型为[Deserialized.Computer])。在尝试使用我的reserialize方法重新编译它之前,我试图找出如何键入检查此对象。

例如,如果我尝试编译$ deserializedComputer,它会告诉我:

$computer = [Computer]::new("test-machine", "192.168.1.2")
$computer | Export-CliXml C:\Powershell\exportTest.xml
$deserializedComputer = Import-CliXml C:\Powershell\exportTest.xml

我理解为什么不能这样做,我只是使用错误信息来指出该对象知道它的类型为[Deserialized.Computer] < / em>的

我找不到从$ deserializedComputer.getMember()返回的任何内容,表明它的类型是[Deserialized.Computer],我能找到的唯一信息就是它的[PSObject]类型,我怎么能类型检查此对象确实是[Deserialized.Computer]类型?

我应该添加[Deserialized.Computer]类型在运行时不存在,所以我不能直接在我的代码中使用它,否则我只会使用:

Cannot convert value "Computer" to type "Computer". Error: "Cannot convert the "Computer" value of type "Deserialized.Computer" to type 
"Computer"."

1 个答案:

答案 0 :(得分:4)

使用(提示:gm是Get-Member的别名)

$type = $deserializedComputer | gm | Select -Property TypeName -First 1

然后你应该能够访问像

这样的值
$type.TypeName

您还可以键入check以确保它是使用

的计算机
$deserializedComputer.ToString()

或者,如果您想要其他方式,请使用

[type]$deserializedComputer.ToString()

修改

您可以使用以下

进行检查
# you can also use $deserializedComputer.ToString() -eq [Computer].ToString()
if ([type]$deserializedComputer.ToString() -eq [Computer])
{

}

您的完整课程类似于:

class Computer 
{
    $Private:hostname
    $Private:ipAddress

    Computer(){}

    Computer([String] $hostname, [String] $ipAddress)
    {
        $this.hostname = $hostname
        $this.ipAddress = $ipAddress
    }
    static [Computer] reserialize([PSObject] $deserializedComputer)
    {
    # you can also use $deserializedComputer.ToString() -eq [Computer].ToString()
    if ([type]$deserializedComputer.ToString() -eq [Computer])
    {
       return [Computer]::new($deserializedComputer.hostname, $deserializedComputer.ipAddress)
    }
    return [Computer]::new()
    }
}

导出/导入

$filePath = "C:\Powershell\exportTest.xml"

$computer = [Computer]::new("test-machine", "192.168.1.2")
$computer | Export-CliXml $filePath
$deserializedComputer = Import-CliXml $filePath

重新整理方法

[Computer]::reserialize($deserializedComputer)