Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,86 @@ private void CleanUp()
#endregion IDisposable Members
}

/// <summary>
/// Implements ConvertTo-CliXml command.
/// </summary>
[Cmdlet(VerbsData.ConvertTo, "CliXml", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=2280866")]
[OutputType(typeof(string))]
public sealed class ConvertToClixmlCommand : PSCmdlet
{
#region Parameters

/// <summary>
/// Gets or sets input objects to be converted to CliXml object.
/// </summary>
[Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true)]
public PSObject InputObject { get; set; }

/// <summary>
/// Gets or sets depth of serialization.
/// </summary>
[Parameter]
[ValidateRange(1, int.MaxValue)]
public int Depth { get; set; } = 2;

#endregion Parameters

#region Private Members

private readonly List<object> _inputObjectBuffer = new();

#endregion Private Members

#region Overrides

/// <summary>
/// Process record.
/// </summary>
protected override void ProcessRecord()
{
_inputObjectBuffer.Add(InputObject);
}

/// <summary>
/// End Processing.
/// </summary>
protected override void EndProcessing()
{
WriteObject(PSSerializer.Serialize(_inputObjectBuffer, Depth, enumerate: true));
}

#endregion Overrides
}

/// <summary>
/// Implements ConvertFrom-CliXml command.
/// </summary>
[Cmdlet(VerbsData.ConvertFrom, "CliXml", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=2280770")]
public sealed class ConvertFromClixmlCommand : PSCmdlet
{
#region Parameters

/// <summary>
/// Gets or sets input object which is written in CliXml format.
/// </summary>
[Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true)]
public string InputObject { get; set; }

#endregion Parameters

#region Overrides

/// <summary>
/// Process record.
/// </summary>
protected override void ProcessRecord()
{
WriteObject(PSSerializer.Deserialize(InputObject));
}

#endregion Overrides
}

/// <summary>
/// Helper class to import single XML file.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ CmdletsToExport = @(
'Get-TraceSource', 'Set-TraceSource', 'Add-Type', 'Get-TypeData', 'Remove-TypeData', 'Update-TypeData',
'Get-UICulture', 'Get-Unique', 'Get-Uptime', 'Clear-Variable', 'Get-Variable', 'New-Variable',
'Remove-Variable', 'Set-Variable', 'Get-Verb', 'Write-Verbose', 'Write-Warning', 'Invoke-WebRequest',
'Format-Wide', 'ConvertTo-Xml', 'Select-Xml', 'Get-Error', 'Update-List', 'Unblock-File'
'Format-Wide', 'ConvertTo-Xml', 'Select-Xml', 'Get-Error', 'Update-List', 'Unblock-File', 'ConvertTo-CliXml',
'ConvertFrom-CliXml'
)
FunctionsToExport = @()
AliasesToExport = @('fhx')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CmdletsToExport = @(
'Add-Type', 'Get-TypeData', 'Remove-TypeData', 'Update-TypeData', 'Get-UICulture', 'Get-Unique', 'Get-Uptime',
'Clear-Variable', 'Get-Variable', 'New-Variable', 'Remove-Variable', 'Set-Variable', 'Get-Verb', 'Write-Verbose',
'Write-Warning', 'Invoke-WebRequest', 'Format-Wide', 'ConvertTo-Xml', 'Select-Xml', 'Get-Error', 'Update-List',
'Out-GridView', 'Show-Command', 'Out-Printer'
'Out-GridView', 'Show-Command', 'Out-Printer', 'ConvertTo-CliXml', 'ConvertFrom-CliXml'
)
FunctionsToExport = @()
AliasesToExport = @('fhx')
Expand Down
39 changes: 39 additions & 0 deletions src/System.Management.Automation/engine/serialization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,45 @@ public static string Serialize(object source, int depth)
return sb.ToString();
}

/// <summary>
/// Serializes list of objects into PowerShell CliXml.
/// </summary>
/// <param name="source">The input objects to serialize.</param>
/// <param name="depth">The depth of the members to serialize.</param>
/// <param name="enumerate">Enumerates input objects and serializes one at a time.</param>
/// <returns>The serialized object, as CliXml.</returns>
internal static string Serialize(IList<object> source, int depth, bool enumerate)
{
StringBuilder sb = new();

XmlWriterSettings xmlSettings = new()
{
CloseOutput = true,
Encoding = Encoding.Unicode,
Indent = true,
OmitXmlDeclaration = true
};

XmlWriter xw = XmlWriter.Create(sb, xmlSettings);
Serializer serializer = new(xw, depth, useDepthFromTypes: true);

if (enumerate)
{
foreach (object item in source)
{
serializer.Serialize(item);
}
}
else
{
serializer.Serialize(source);
}

serializer.Done();

return sb.ToString();
}

/// <summary>
/// Deserializes PowerShell CliXml into an object.
/// </summary>
Expand Down
Loading