我不認爲你可以避免對數據進行一些迭代,如果頭部不是第一個 - 除非你願意數據的下游消費者來整理對象的「形狀」。
爲此,我假設一個遠程調用的所有對象具有相同的結構,並且結構是平坦的。
當標題出現時,將標題名稱保存到數據的單獨變量中。例如。陣列中的 - 這樣的事情:
$header = @()
$data = @()
# assuming variable $remoteObject which is a psobject
If ($remoteObjIsHeader) {
$remoteObject | Get-Member -MemberType Properties | % {
$header += $_.Name
}
}
else {
$data += $remoteObject
}
一旦你擁有所有你可以開始使用這樣的功能,推出新的psobjects頭。
Function Write-DataBuffer($Headers, $Data) {
foreach($item in $Data) {
$obj = New-Object -TypeName psobject
for ($i =0; $i -lt $Headers.length; $i++) {
$obj | Add-Member -MemberType NoteProperty -Name $Headers[$i] -Value $item[$i]
}
Write-Output $obj
}
}
你可以得到票友,直到頭到達$data
緩衝區的內容,那麼你將只能通過行數必須循環接收到的幀頭到來之前。但是你說這是異步的,所以我不確定線程的影響。
If ($remoteObjIsHeader) {
$remoteObject | Get-Member -MemberType Properties | % {
$header += $_.Name
}
if ($data.length -gt 0) {
# header arrived after data - flush the buffer
Write-DataBuffer -Data $data
}
}
else {
if ($headers.length -gt 0) {
# have the headers just output the data
Write-DataBuffer -Data @($remoteObject)
}
else {
# don't have headers - buffer the data
$data += $remoteObject
}
}