2017-07-27 98 views
4

使用XML導出和導入自定義類型對象時遇到問題。 對象更改類型並丟失方法。使用xml導出和導入自定義類型對象時遇到問題

腳本:

# Powershell 5 

$file = 'C:\Scripts\Storage\file.xml' 

class test { 
    [string] $name 
    [string] getValue() { 
     return 'value' 
    } 
} 

$a = [test]::new() 
$a.GetType() # object type is "test" 
$a |gm  # it has method "getValue" | Name  : getValue , 
MemberType : Method 


$a | Export-Clixml $file 
$b = Import-Clixml $file 


$b.GetType() # object type is "PSObject" 
$b | gm  # method "getValue" is no longer there 

我怎麼$b.gettype() -eq $a.gettype()是真的嗎?

我想將對象導出到XML並重新導入它,而不會丟失它的類型和方法。

回答

5

所以這是事情變得有點混亂的地方。是的,$b是PSObject,但它也是類型爲[test]的對象。要看到這一點,你可以這樣做:

$b.psobject.TypeNames 

您將看到:

Deserialized.test 
Deserialized.System.Object 

你這樣做雖然失去了法,由於對象被反序列化。這是導出到XML所固有的,然後重新導入它。在將對象保存到磁盤時,反序列化是一個必要的罪惡,因爲當您將對象導入磁盤時,它們不再是「實時」對象,它們只是對象在將它們導出到磁盤時的樣子的快照。

導出的對象保留了它們的所有屬性,就像你期望你的朋友的快照那樣(頭髮的顏色,臉上的假笑,他們給一隻毛絨袋鼠的粗俗手勢) ,但他們失去了互動方式(不管你多麼癢癢,照片都不會咯咯地笑)。

你能做什麼,如果你真的想$b有其方法,是強類型它,當你導入它,如:

[test]$b = Import-Clixml $file 

此時$b會表現$a究竟如何呢。

+1

謝謝:) 對於這樣一個明確的答案:) 解決 – Goa