Pourquoi le get Day semble-t-il renvoyer des objets DateTime, mais le binaryserializer indique qu'il renvoie un psobject?

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

Question

Prenez le simple HASHTABLE :

$data = @{
    First = 'Justin';
    Last = 'Dearing';
    StartDate = Get-Date '2002-03-23';
}

La clé StartDate semble contenir un DateTime .

C:\Users\zippy\Documents> $data.StartDate.GetType().FullName
System.DateTime

Toutefois, si j'essaie d'effectuer une sérialisation binaire dessus, je reçois une exception qui se plaint de psobject n'est pas sérialisable.

$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $data)
$ms.Close()

lance:

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

Ce message disparaît et tout fonctionne si j'utilise une mise en forme explicite sur [DateTime] comme:

$data = @{
    First = 'Justin';
    Last = 'Dearing';
    StartDate = [DateTime] (Get-Date '2002-03-23');
}

La date d'obtention n'est donc pas vraiment de retourner une date d'heure, ou est une autre bizarrerie de PowerShell au travail ici.

Était-ce utile?

La solution

Chaque objet de PowerShell est en fait enveloppé principalement de manière transparente dans un psobject.Je dis principalement de manière transparente car il y a plus de quelques bugs dans PowerShell qui omettent pour éliminer le wrapper avant de fuir l'objet dans une autre API.Cela provoque toutes sortes de problèmes, un peu comme celui que vous voyez maintenant.Recherchez Connect.Microsoft.com/powershell pour PSObject Wrapper.Je crois que ce n'est plus un problème en V3 avec le nouveau moteur basé sur la DLR.

Autres conseils

base sur le MSDN:

classe psoobject: Encapsule un objet de base d'objet de type ou de type PSCustomObject pour permettre une vue cohérente de tout objet dans l'environnement 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top