2012-03-09 15 views
5

सरल 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 serializable नहीं है मिलता है।

$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-तिथि नहीं वास्तव में है एक डेटटाइम लौट रहा है, या यहां काम पर कुछ अन्य शक्तियों की विषमता है। MSDN पर

+0

मुझे लगता है कि पीएस में सब कुछ 'PSObject' पर डिफ़ॉल्ट है जब तक कि आप स्पष्ट रूप से प्रकार को परिभाषित नहीं करते। यह गतिशील डेटाटाइप रूपांतरण करता है, इसलिए यह केवल उस स्ट्रिंग को वापस कर सकता है जिसे इसे रनटाइम पर 'System.Datetime' के रूप में व्याख्या करता है। – JNK

+0

@ जेएनके लेकिन ऑब्जेक्ट.गेट टाइप() क्यों डेटटाइम के रूप में कुछ समझता है कि बाइनरी फॉर्मेटर PSObject के रूप में व्याख्या करता है? –

+0

यह अनुमान लगा रहा है, लेकिन हो सकता है क्योंकि इसे रनटाइम पर व्याख्या किया जा रहा है (चूंकि आप PSObject की 'GetType()' विधि चला रहे हैं) - बाइनरी फॉर्मेटर एक सिस्टम क्लास है, पीएस क्लास – JNK

उत्तर

3

पावरहेल में प्रत्येक वस्तु वास्तव में एक psobject में पारदर्शी रूप से लपेटा जाता है। मैं ज्यादातर पारदर्शी रूप से कहता हूं क्योंकि ऑब्जेक्ट को किसी अन्य एपीआई में ले जाने से पहले रैपरहेल में कुछ बग्स हैं जो रैपर को हटाने के लिए छोड़ देते हैं। इससे सभी प्रकार के मुद्दों का कारण बनता है, जैसा कि आप अब देखते हैं। Psobject wrapper के लिए connect.microsoft.com/powershell खोजें। मेरा मानना ​​है कि यह नए डीएलआर आधारित इंजन के साथ v3 में अब कोई मुद्दा नहीं है।

+0

बस वर्चुअलबॉक्स को निकाल दिया गया और कोड काम करता है। स्पष्टीकरण देने के लिए धन्यवाद। –

+1

यहां एक और उदाहरण है जहां psobject चीजों को खराब कर देता है; http://stackoverflow.com/questions/837095/why-does-powershells-return-keyword-cause-type-errors – x0n

+0

यह इंगित करने के लिए धन्यवाद। दिलचस्प पढ़ना –

5

आधार:

PSOobject कक्षा: प्रकार वस्तु का आधार वस्तु समाहित या PSCustomObject टाइप विंडोज 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