get-dateがDateTimeオブジェクトを返すように見えますが、BinarySerializerはPSObjectを返すことを示しますか?

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

質問

単純 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
.

このメッセージは消え、明示的なキャストを使用すると、次のような明示的なキャストを使用すると、すべてが機能します。

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

は、Get-Dateです。

役に立ちましたか?

解決

PowerShellのすべてのオブジェクトは、実際にPSObjectで主に透過的に折り返されています。PowerShellには、オブジェクトを別のAPIに漏らす前に、ラッパーを削除するのを省略しているため、私は主に透過的に言っています。これは、あなたが今見ているもののように、あらゆる種類の問題を引き起こします。connect.microsoft.com/powershell for PSobjectラッパーの検索。私はこれが新しいDLRベースのエンジンとのv3の問題ではないと思います。

他のヒント

MSDNのベース:

PSOObjectクラス: Windows PowerShell環境内の任意のオブジェクトの一貫したビューを可能にするために、オブジェクト型の基本オブジェクトをカプセル化するか、PsCustomObjectを入力します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top