¿Por qué la fecha de llegada parece devolver los objetos de DateTime, pero el BinarySerializer indica que devuelve un PSOBJECT?
-
10-12-2019 - |
Pregunta
Tome la simple Hashtable :
$data = @{
First = 'Justin';
Last = 'Dearing';
StartDate = Get-Date '2002-03-23';
}
La clave StartDate parece contener una DateTime .
C:\Users\zippy\Documents> $data.StartDate.GetType().FullName
System.DateTime
Sin embargo, si intento realizar la serialización binaria en ella, obtengo una excepción quejándose de que PSOBJECT no es serializable.
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $data)
$ms.Close()
lanza:
DocumentsException calling "Serialize" with "2" argument(s): "Type 'System.Management.Automation.PSObject' in Assembly 'System.Management.Automation, Versio
n=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable."
At C:\Users\jdearing\AppData\Local\Temp\b8967f99-0a24-41f7-9c97-dad2bc288bd9.ps1:12 char:14
+ $bf.Serialize <<<< ($ms, $data)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Este mensaje se va y todo funciona si uso un reparto explícito a [DateTime], así:
$data = @{
First = 'Justin';
Last = 'Dearing';
StartDate = [DateTime] (Get-Date '2002-03-23');
}
Así es que la fecha es que realmente está devolviendo un DateTime, o es una otra rareza de PowerShell en el trabajo aquí.
Solución
Cada objeto en PowerShell está realmente envuelto principalmente de forma transparente en un psobject.Digo principalmente de manera transparente porque hay más de algunos errores en PowerShell que omiten para eliminar la envoltura antes de fugarse del objeto a otra API.Esto provoca todo tipo de problemas, al igual que el que ve ahora.Buscar connect.microsoft.com/powershell para la envoltura de PSOBJECT.Creo que esto ya no es un problema en V3 con el nuevo motor basado en DLR.
Otros consejos
Base en el MSDN:
PSOOBJECT CLASE: Encapsula un objeto base de tipo de objeto o tipo PSCustomObject para permitir una vista consistente de cualquier objeto dentro del entorno Windows PowerShell.
( get-Date '2002-03-23' ) -IS [psobject]
True
( get-Date '2002-03-23' ) -IS [datetime]
True
[datetime]( get-Date '2002-03-23' ) -IS [datetime]
True
[datetime]( get-Date '2002-03-23' ) -IS [psobject]
False