Почему Get-Date возвращает объекты DateTime, а BinarySerializer указывает, что он возвращает объект PSObject? - PullRequest
5 голосов
/ 09 марта 2012

Возьмем простую HashTable :

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

Кажется, что ключ StartDate содержит DateTime .

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

Однако, еслиЯ пытаюсь выполнить двоичную сериализацию на нем, получаю исключение, сообщающее, что PSObject не сериализуем.

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

Броски:

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

Это сообщение исчезаети все работает, если я использую явное приведение к [DateTime], например, так:

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

Так что Get-Date на самом деле не возвращает DateTime или есть какая-то другая странная сила в работе здесь.

Ответы [ 2 ]

5 голосов
/ 09 марта 2012

База на MSDN:

PSOobject Class: Инкапсулирует базовый объект типа Object или типа PSCustomObject, чтобы обеспечить согласованное представление любого объекта в среде 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
3 голосов
/ 09 марта 2012

Каждый объект в powershell фактически прозрачно упакован в psobject. Я говорю в основном прозрачно, потому что в PowerShell есть несколько ошибок, из-за которых не удаляется оболочка перед передачей объекта другому API. Это вызывает всевозможные проблемы, очень похожие на ту, которую вы видите сейчас. Найдите connect.microsoft.com/powershell для оболочки psobject. Я считаю, что это больше не проблема в v3 с новым движком на основе DLR.

...