Когда явным образом бросаю свой новый объект (см. Первую строку кода), мой вновь созданный EntityReference сохраняется, не будучи обернутым в PSObject, и поэтому его сериализация работает просто отлично:Без явного приведения объект обертывается в PSObject
$entityRef1 = [Microsoft.Xrm.Sdk.EntityReference](new-object Microsoft.Xrm.Sdk.EntityReference("businessunit", [System.Guid]::NewGuid()))
$unit = new-object Microsoft.Xrm.Sdk.Entity("businessunit")
$unit.Attributes["parentbusinessunitid"] = $entityRef1
$unit.Attributes["parentbusinessunitid"].GetType() # Produces "EntityReference"
# Serialize $unit including the entityRef, and write its xml representation
$serializer = New-Object System.Runtime.Serialization.DataContractSerializer($unit.GetType())
$stream = New-Object System.IO.MemoryStream
$serializer.WriteObject($stream, $unit)
$stream.Flush()
$stream.Seek(0, [System.IO.SeekOrigin]::Begin)
$reader = New-Object System.IO.StreamReader($stream)
$reader.ReadToEnd()
Однако, когда я не использую бросок:
$entityRef1 = (new-object Microsoft.Xrm.Sdk.EntityReference("businessunit", [System.Guid]::NewGuid()))
Powershell жалуется, когда я хочу, чтобы сериализовать:
Exception calling "WriteObject" with "2" argument(s): "Type 'System.Management.Automation.PSObject' with data contract name 'PSObject:http://schemas.datacontract.org/2004/07/System.Management.Automation' is not expected.
Теперь я прочитал Why does Get-Date seem to return DateTime objects, but the BinarySerializer indicate it returns a PSObject?, и, казалось бы, что это та же самая проблема ....
за исключением того, что я использую Powershell 3,0 ($PSVersionTable.psversion
производит версию 3.0.-1.-1) и что «неправильный» фрагмент кода из этого сообщения отлично работает в моей среде Powershell ...
В этом сообщении предлагается, чтобы новый движок, основанный на DLR от Powershell 3, больше не должен вызывать эти проблемы, поэтому были ли они слишком оптимистичны относительно что, или я столкнулся с чем-то еще?
Edit: Приведенный ниже код производит такое же поведение, не будучи зависимыми от SDK CRM. С броском, PowerShell жалуется не в состоянии сериализовать System.UriBuilder
, в то время как без броска, он жалуется на получение System.Management.Automation.PSObject
экземпляра:
# $uriBuilder = [UriBuilder](New-Object UriBuilder)
$uriBuilder = (New-Object UriBuilder)
$dict = new-object Hashtable
$dict["mykey"] = $uriBuilder
$dict["mykey"].GetType() # Produces "UriBuilder"
# Serialize $dict including the uriBuilder, and write its xml representation
$serializer = New-Object System.Runtime.Serialization.DataContractSerializer($dict.GetType())
$stream = New-Object System.IO.MemoryStream
$serializer.WriteObject($stream, $dict)
$stream.Flush()
$stream.Seek(0, [System.IO.SeekOrigin]::Begin)
$reader = New-Object System.IO.StreamReader($stream)
$reader.ReadToEnd()
Возможно, вы столкнулись с ошибкой - v3 принесли несколько psobject для разворота ошибок для езды в течение периода альфы и беты. Возможно, их больше. Можете ли вы дать репрограмму, которая не требует XRM SDK?:) – x0n
@ x0n: Совершено, я думаю, это демонстрирует то же поведение. – Astrotrain
Ваш пример не работает в Powershell 2 ISE, потому что он не может найти DataContractSerializer, и я получаю 'New-Object: Не могу найти тип [System.Runtime.Serialization.DataContractSerializer]: убедитесь, что сборка, содержащая этот тип, загружена. В строке: 9 символов: 25 + $ serializer = Новый объект <<<< System.Runtime.Serialization.DataContractSerializer ($ dict.GetType()) + CategoryInfo: InvalidType: (:) [New-Object], PSArgumentException + FullyQualifiedErrorId: TypeNotFound, Microsoft.PowerShell.Commands.NewObjectCommand' – Ytrog