如何使用 Import-CliXml 反序列化自定义 class 对象的通用列表?
How can I use Import-CliXml to deserialize a generic list of custom class objects?
我正在尝试学习 XML PowerShell 中的序列化。所以,我正在制作一个简单的联系人列表来序列化和反序列化。我 运行 遇到的问题是 Contact
对象在我使用 Import-CliXml
.
导入时表现不同
这是我现在正在尝试的:
class Contact {
[string]$FirstName;
[string]$LastName;
[Int64]$PhoneNumber; }
$bob = new-object Contact
$bob.FirstName = "Bob"
$bob.LastName = "Johnson"
$bob.PhoneNumber = 1235589876
$bill = new-object Contact
$bill.FirstName = "Bill"
$bill.LastName = "Carson"
$bill.PhoneNumber = 1235589875
$ContactList = new-object System.Collections.Generic.List[Contact]
$ContactList.Add($bob)
$ContactList.Add($bill)
[xml]$data = $ContactList | convertto-xml
new-item "C:\Users\Public\Documents\Contacts.xml"
$data | export-clixml "C:\Users\Public\Documents\Contacts.xml"
[xml]$ImportedData = import-clixml "C:\Users\Public\Documents\Contacts.xml"
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedList = $ImportedData.Objects.Object
导入的 List[Contact]
有一个 Contact
对象的集合,但我似乎无法从它们的属性中获取信息。例如,当我尝试以下操作时出现空行:
$ImportedList | foreach-object { write-host $_.FirstName }
我知道对象在那里是因为 return 我从 $ImportedList
:
$ImportedList
Type Property
---- --------
Contact {FirstName, LastName, PhoneNumber}
Contact {FirstName, LastName, PhoneNumber}
我正在尝试将其设置为 return 与 $ContactList
相同的内容:
$ContactList
FirstName LastName PhoneNumber
--------- -------- -----------
Bob Johnson 1235589876
Bill Carson 1235589875
如有任何帮助,我们将不胜感激。
您遇到的问题是 import-clixml
,它不是 return 对象类型 [contact]
。 $ImportedData.Objects.Object
而不是类型 [System.Xml.XmlElement]
这就是为什么你在这里得到空行:
$ImportedList | foreach-object { write-host $_.FirstName }
因为管道中的对象没有 属性 firstname
。
代替这两行:
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedList = $ImportedData.Objects.Object
试试这个:
$ImportedList = @()
$ImportedData.Objects.Object | %{$ImportedList += [contact]@{firstname=$_.property[0].'#text';lastname=$_.property[1].'#text';phonenumber=$_.property[2].'#text'}}
谢谢 Tav 的明确回答。这就是我最终使用的:
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedData.Objects.Object | foreach-object {
$NewContact = new-object Contact
$NewContact.FirstName = $_.Property[0].'#text'
$NewContact.LastName = $_.Property[1].'#text'
$NewContact.PhoneNumber = [Int64]$_Property[2].'#text'
$ImportedList.Add($NewContact) }
更新
我能够通过 Where()
方法使用 属性 名称:
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedData.Objects.Object | foreach-object {
$NewContact = new-object Contact
$NewContact.FirstName = $_.Property.Where({ $_.Name -eq "FirstName" }).'#text'
$NewContact.LastName = $_.Property.Where({ $_.Name -eq "LastName" }).'#text'
$NewContact.PhoneNumber = [Int64]$_Property.Where({ $_.Name -eq "PhoneNumber" }).'#text'
$ImportedList.Add($NewContact) }
我正在尝试学习 XML PowerShell 中的序列化。所以,我正在制作一个简单的联系人列表来序列化和反序列化。我 运行 遇到的问题是 Contact
对象在我使用 Import-CliXml
.
这是我现在正在尝试的:
class Contact {
[string]$FirstName;
[string]$LastName;
[Int64]$PhoneNumber; }
$bob = new-object Contact
$bob.FirstName = "Bob"
$bob.LastName = "Johnson"
$bob.PhoneNumber = 1235589876
$bill = new-object Contact
$bill.FirstName = "Bill"
$bill.LastName = "Carson"
$bill.PhoneNumber = 1235589875
$ContactList = new-object System.Collections.Generic.List[Contact]
$ContactList.Add($bob)
$ContactList.Add($bill)
[xml]$data = $ContactList | convertto-xml
new-item "C:\Users\Public\Documents\Contacts.xml"
$data | export-clixml "C:\Users\Public\Documents\Contacts.xml"
[xml]$ImportedData = import-clixml "C:\Users\Public\Documents\Contacts.xml"
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedList = $ImportedData.Objects.Object
导入的 List[Contact]
有一个 Contact
对象的集合,但我似乎无法从它们的属性中获取信息。例如,当我尝试以下操作时出现空行:
$ImportedList | foreach-object { write-host $_.FirstName }
我知道对象在那里是因为 return 我从 $ImportedList
:
$ImportedList
Type Property
---- --------
Contact {FirstName, LastName, PhoneNumber}
Contact {FirstName, LastName, PhoneNumber}
我正在尝试将其设置为 return 与 $ContactList
相同的内容:
$ContactList
FirstName LastName PhoneNumber
--------- -------- -----------
Bob Johnson 1235589876
Bill Carson 1235589875
如有任何帮助,我们将不胜感激。
您遇到的问题是 import-clixml
,它不是 return 对象类型 [contact]
。 $ImportedData.Objects.Object
而不是类型 [System.Xml.XmlElement]
这就是为什么你在这里得到空行:
$ImportedList | foreach-object { write-host $_.FirstName }
因为管道中的对象没有 属性 firstname
。
代替这两行:
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedList = $ImportedData.Objects.Object
试试这个:
$ImportedList = @()
$ImportedData.Objects.Object | %{$ImportedList += [contact]@{firstname=$_.property[0].'#text';lastname=$_.property[1].'#text';phonenumber=$_.property[2].'#text'}}
谢谢 Tav 的明确回答。这就是我最终使用的:
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedData.Objects.Object | foreach-object {
$NewContact = new-object Contact
$NewContact.FirstName = $_.Property[0].'#text'
$NewContact.LastName = $_.Property[1].'#text'
$NewContact.PhoneNumber = [Int64]$_Property[2].'#text'
$ImportedList.Add($NewContact) }
更新
我能够通过 Where()
方法使用 属性 名称:
$ImportedList = new-object System.Collections.Generic.List[Contact]
$ImportedData.Objects.Object | foreach-object {
$NewContact = new-object Contact
$NewContact.FirstName = $_.Property.Where({ $_.Name -eq "FirstName" }).'#text'
$NewContact.LastName = $_.Property.Where({ $_.Name -eq "LastName" }).'#text'
$NewContact.PhoneNumber = [Int64]$_Property.Where({ $_.Name -eq "PhoneNumber" }).'#text'
$ImportedList.Add($NewContact) }