2016-10-25 3 views
0

Я пытаюсь изучить сериализацию XML в PowerShell. Итак, я делаю простой список контактов для сериализации и десериализации. Проблема, с которой я сталкиваюсь, заключается в том, что объект Contact действует по-разному, когда я импортирую его с помощью Import-CliXml.Как я могу использовать 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 } 

Я знаю, что объекты находятся там из-за возвращения я получаю от $ImportedList:

$ImportedList 

Type Property 
---- -------- 
Contact {FirstName, LastName, PhoneNumber} 
Contact {FirstName, LastName, PhoneNumber} 

Я пытаюсь получить его вернуть ту же вещь, как $ContactList:

$ContactList 

FirstName LastName PhoneNumber 
--------- -------- ----------- 
Bob  Johnson 1235589876 
Bill  Carson 1235589875 

Любая помощь будет принята с благодарностью.

+0

пропускает 'ConvertTo-Xml' шаг, do '$ ContactList | Export-CliXml' вместо –

ответ

1

Проблема, с которой вы сталкиваетесь, составляет до import-clixml, она не возвращает тип объекта [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'}} 
+0

Удивительный! Я наложил свойство 'PhoneNumber' на' Int64', и он работал как шарм. Благодаря! –

0

Спасибо тав для ясного ответа. Это то, что я в конечном итоге с помощью:

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

Update

я был в состоянии использовать имена свойств с 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) } 

 Смежные вопросы

  • Нет связанных вопросов^_^