Serialising and Deserialising data structures is pretty easy when using Export-CliXml/Import-CliXml. However, there are some gotchas. In addition to the already described bug when using [ordered] hashtable in PowerShell v3 with Import-CliXml there is another error when importing [Array] with Import-CliXml: an [Array] becomes an [ArrayList]. The following code shows the problem:

PS > $ht = @{};
PS > $ht.Array = @();
PS > $ht.Array.GetType();
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS > $ht | Export-Clixml ht.xml;
PS > $ht2 = Import-Clixml ht.xml;
PS > $ht2.Array.GetType();
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ArrayList System.Object

Again, this error seems to occur when you do the actual import, because the underlying xml file still contains the correct type information:


 System.Collections.Hashtable
 System.Object

 <s>Array</s>

 System.Object[]
 System.Array
 System.Object

The problem is that these data types behave differently. For example, check the “Length” property. It returns the number of entries (Count) on [Array] and the individual length of the the list items on [ArrayList]:

PS > $a = @("11", "22");
PS > $a.Length;
2

$al = New-Object System.Collections.ArrayList($null);
PS > $al.Add("11");
0
PS > $al.Add("22");
1
PS > $al.Length;
2
2

I filed a bug on Microsoft Connect under [Array] becomes [ArrayList] when imported via Import-CliXml.

By the way: it does not make a difference if you use “Set-StrictMode -Version 3” or not.

1 Comment »

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.