Pourquoi le get Day semble-t-il renvoyer des objets DateTime, mais le binaryserializer indique qu'il renvoie un psobject?
-
10-12-2019 - |
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 $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.
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