¿Por qué la fecha de llegada parece devolver los objetos de DateTime, pero el BinarySerializer indica que devuelve un PSOBJECT?

StackOverflow https://stackoverflow.com//questions/9636698

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í.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top