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 »