2012-03-09 3 views
5

は、単純なHashTableしてください:Get-DateはDateTimeオブジェクトを返すように見えるが、BinarySerializerはPSObjectを返すと示しているのはなぜですか?

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

キー開始日は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-日ですDateTimeを返したり、ここで働いている他のパワーシェルの奇妙なことです。 MSDNの

+0

私は、あなたが明示的に型を定​​義しない限り、PSの中のすべてが 'PSObject'にデフォルト設定されていると思います。これは動的なデータ型変換を行うので、実行時に 'System.Datetime'として解釈する文字列を返すことができます。 – JNK

+0

@JNKだが、なぜObject.GetType()がバイナリフォーマッタがPSObjectとして解釈するDateTimeとして何かを解釈するのはなぜですか? –

+0

PSObjectのGetType()メソッドを実行しているため、実行時に解釈されている可能性があります。バイナリフォーマッタは、PSクラスではなくシステムクラスである – JNK

答えて

3

powershellのすべてのオブジェクトは、ほとんどの場合、オブジェクト内でほとんど透過的にラップされます。 powershellには、オブジェクトを別のAPIに漏らす前にラッパーを削除することを省略したバグがいくつかあるので、私はほとんど透過的に言います。これは今見ているような、あらゆる種類の問題を引き起こします。 psobjectラッパーについては、connect.microsoft.com/powershellを検索してください。私はこれが新しいDLRベースのエンジンを搭載したv3ではもはや問題ではないと信じています。

+0

VirtualBoxを起動してコードが機能します。明確化のためにありがとう。 –

+1

ここにpsobjectが物事をねじ込む別の例があります。 http://stackoverflow.com/questions/837095/why-does-powershells-return-keyword-cause-type-errors – x0n

+0

それを指摘してくれてありがとう。興味深い読書。 –

5

ベース:

PSOobjectクラス: は、Windows PowerShell環境内の任意のオブジェクトの一貫したビューを可能にするためにObject型または型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 
関連する問題