2012-03-09 52 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 

此消息消失,一切工作,如果我使用一个显式的[DATETIME]像这样:

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

所以是获取最新不是真的返回一个DateTime,或者是在这里工作的一些其他powershell怪异。

+0

我认为PS中的所有内容默认为“PSObject”,除非您明确定义类型。它执行动态数据类型转换,所以它可能只是返回一个字符串,它在运行时解释为“System.Datetime”。 – JNK 2012-03-09 15:39:22

+0

@JNK但为什么Object.GetType()将某些东西解释为二进制格式化程序解释为PSObject的DateTime? – 2012-03-09 15:41:59

+0

这只是猜测,但可能是因为它在运行时被解释(因为您正在运行PSObject的GetType()方法) - 二进制格式化程序是系统类,而不是PS类 – JNK 2012-03-09 15:44:09

回答

3

powershell中的每个对象实际上都是在一个psobject中透明地包装的。我主要是透明地说,因为在PowerShell中有多个漏洞在漏掉对象到另一个API之前省略掉了。这导致各种问题,就像你现在看到的那样。搜索connect.microsoft.com/powershell以获得psobject包装。我相信在新的基于DLR的引擎中,这不再是第3版中的问题。

+0

刚刚启动了VirtualBox并且代码确实起作用。感谢澄清。 – 2012-03-09 21:02:19

+1

这是另一个例子,psobject把事情搞砸了; http://stackoverflow.com/questions/837095/why-does-powershells-return-keyword-cause-type-errors – x0n 2012-03-11 02:53:16

+0

谢谢指出。有趣的阅​​读。 – 2012-03-11 20:09:49

5

基座上的MSDN:

PSOobject类别: 封装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 
相关问题