2

У меня возникают проблемы с классами и типами Powershell 5 при реимпертизации десериализованных объектов с помощью команды Import-CliXml.Проблемы с десериализованным типом объектов - особенно с классами Powershell 5 и Import-CliXml

У меня есть объект типа компьютера, и я хочу сохранить это как XML, а затем повторно импортировать этот следующий раз, когда скрипт запускается

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) 
    } 
} 

Я экспортировать и импортировать объект, используя следующие:

$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]). Я пытаюсь выяснить, как напечатать этот объект, прежде чем пытаться его повторно инициализировать, используя метод reserialize.

Например, если я пробую и литой $ deserializedComputer он говорит мне, что:

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

Я понимаю, почему это не может быть литыми, я просто с помощью сообщения об ошибке, чтобы указать, что объект есть знание, что это типа [Deserialized.Computer]

Я ничего не могу найти, возвращенное от $ deserializedComputer.getMember(), который указывает, что это типа [Deserialized.Computer], единственная информация, которую я могу найти в том, что это типа [PSObject], как я могу ввести проверку, что этот объект действительно имеет тип [Deserialized.C omputer]?

Я должен добавить этот тип [Deserialized.Компьютер] не существует во время выполнения, так что я не могу использовать это непосредственно в моем коде, в противном случае я бы просто использовать:

$deserializedComputer.getType() -eq [Deserialized.Computer] 
+1

'$ deserializedComputer' является' [PSObject] 'с' значением листа PSTypeNames' устанавливается в 'Deserialized.Computer'. См. '$ DeserializedComputer.psobject.TypeNames' –

ответ

2

Использование (Подсказка: гм является псевдонимом для Get-Member)

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

, то вы должны быть в состоянии получить доступ к значению, как

$type.TypeName 

можно также ввести убедитесь, что компьютер с помощью

$deserializedComputer.ToString() 

Или, если вы хотите другой способ использовать

[type]$deserializedComputer.ToString() 

Edit:

Вы можете проверить это с помощью следующей

# 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 

И метод Reserialize

[Computer]::reserialize($deserializedComputer)