无法使用 XML导出和导入自定义类型对象. 对象更改类型并丢失方法. 脚本: # Powershell 5$file = 'C:\Scripts\Storage\file.xml'class test { [string] $name [string] getValue() { return 'value' }}$a = [test]::new()$a.Ge
对象更改类型并丢失方法.
脚本:
# 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()为true?
我想将对象导出到XML并重新导入它,而不会丢失其类型和方法.
所以这就是事情变得有点混乱的地方.是的,$b是一个PSObject,但它也是一个类型为[test]的对象.要看到这个,你可以这样做:$b.psobject.TypeNames
你会看见:
Deserialized.test Deserialized.System.Object
但是,由于对象被反序列化,您确实会丢失该方法.这是导出到XML,然后重新导入它所固有的.将对象保存到磁盘时反序列化是一个必要的恶魔,因为稍后导入它们时它们不再是“实时”对象,它们只是将对象导出到磁盘时的外观快照.
导出的对象保留了他们所有的属性,就像你期望朋友的快照一样(他们的头发的颜色,他们脸上的假笑,他们给袋装袋鼠的粗俗手势),但他们失去了交互式方法(无论你多么痒,照片都不会傻笑).
如果你真的想让$b拥有它的方法,你可以做的是在导入它时强烈输入它,例如:
[test]$b = Import-Clixml $file
在这一点上,$b将完全表现出$a的作用.