Weźmy prosty HashTable:Dlaczego Get-Date wydaje się zwracać obiekty DateTime, ale BinarySerializer wskazuje, że zwraca PSObject?
$data = @{
First = 'Justin';
Last = 'Dearing';
StartDate = Get-Date '2002-03-23';
}
Kluczem StartDate wydaje się zawierać DateTime.
C:\Users\zippy\Documents> $data.StartDate.GetType().FullName
System.DateTime
Jednakże jeśli próbuję wykonać serializacji binarnej na niej, otrzymuję wyjątek twierdząc, że nie jest możliwy do serializacji PSObject.
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $data)
$ms.Close()
Zgłasza:
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
Ten komunikat znika i wszystko działa, jeśli mogę użyć wyraźne zabarwienie [DateTime] tak:
$data = @{
First = 'Justin';
Last = 'Dearing';
StartDate = [DateTime] (Get-Date '2002-03-23');
}
Więc to Get-Date nie bardzo zwrócenie DateTime, lub jest tu kilka innych dziwactw.
Myślę, że wszystko w PS domyślnie jest ustawione na 'PSObject', chyba że wyraźnie zdefiniujesz typ. Wykonuje dynamiczne konwersje typów danych, więc może zwracać ciąg, który interpretuje jako "System.Datetime" w czasie wykonywania. – JNK
@JNK, ale dlaczego Object.GetType() interpretuje coś jako DateTime, że format binarny interpretuje jako PSObject? –
To tylko zgadywanie, ale może dlatego, że jest interpretowane w czasie wykonywania (ponieważ używasz metody 'GetType()' obiektu PSObject) - format binarny jest klasą systemową, a nie klasą PS – JNK