使用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并重新导入,而不会丢失其类型和方法。
答案 0 :(得分:5)
所以这就是事情变得有点混乱的地方。是的,$b
是一个PSObject,但它也是一个类型为[test]
的对象。要看到这个,你可以这样做:
$b.psobject.TypeNames
你会看到:
Deserialized.test
Deserialized.System.Object
但是由于对象被反序列化,你确实失去了方法。这是导出到XML,然后重新导入它所固有的。将对象保存到磁盘时反序列化是一个必要的恶魔,因为当您稍后导入它们时,它们不再是“活着”。对象,它们只是将对象导出到磁盘时对象的快照。
导出的对象保留了他们所有的属性,就像你期望朋友的快照一样(他们的头发的颜色,他们脸上的假笑,他们给予填充的袋鼠的粗俗手势) ),但他们失去了互动方法(无论你多少痒痒,照片都不会傻笑。)
如果您真的希望$b
拥有其方法,您可以做的是在导入时强力输入,例如:
[test]$b = Import-Clixml $file
此时$b
的行为与$a
完全相同。