Private/ConvertTo-EFFlatRecord.ps1

function ConvertTo-EFFlatRecord {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [object]$InputObject
    )

    $record = [ordered]@{}
    foreach ($property in $InputObject.PSObject.Properties) {
        $value = $property.Value
        if ($value -is [DateTime]) {
            $record[$property.Name] = ([DateTime]$value).ToUniversalTime().ToString('o')
        }
        elseif ($value -is [DateTimeOffset]) {
            $record[$property.Name] = ([DateTimeOffset]$value).ToUniversalTime().ToString('o')
        }
        elseif ($null -eq $value -or $value -is [string] -or $value -is [ValueType]) {
            $record[$property.Name] = $value
        }
        else {
            $record[$property.Name] = ConvertTo-EFSerializableValue -InputObject $value | ConvertTo-Json -Depth 10 -Compress
        }
    }
    return [pscustomobject]$record
}