Files
UnrealEngine/Engine/Source/Programs/Shared/EpicGames.Serialization/Converters/CbArrayConverter.cs
2025-05-18 13:04:45 +08:00

85 lines
1.6 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
namespace EpicGames.Serialization.Converters
{
/// <summary>
/// Converter for array types
/// </summary>
/// <typeparam name="T"></typeparam>
class CbArrayConverter<T> : CbConverter<T[]>
{
/// <inheritdoc/>
public override T[] Read(CbField field)
{
if (field.IsNull())
{
return null!;
}
List<T> list = [];
foreach (CbField elementField in field)
{
list.Add(CbSerializer.Deserialize<T>(elementField));
}
return [.. list];
}
/// <inheritdoc/>
public override void Write(CbWriter writer, T[] list)
{
if (list == null)
{
writer.WriteNullValue();
}
else
{
writer.BeginArray();
foreach (T element in list)
{
CbSerializer.Serialize<T>(writer, element);
}
writer.EndArray();
}
}
/// <inheritdoc/>
public override void WriteNamed(CbWriter writer, CbFieldName name, T[] array)
{
if (array == null)
{
writer.WriteNull(name);
}
else
{
writer.BeginArray(name);
foreach (T element in array)
{
CbSerializer.Serialize<T>(writer, element);
}
writer.EndArray();
}
}
}
/// <summary>
/// Factory for CbListConverter
/// </summary>
class CbArrayConverterFactory : CbConverterFactory
{
/// <inheritdoc/>
public override CbConverter? CreateConverter(Type type)
{
if (type.IsArray)
{
Type elementType = type.GetElementType()!;
Type converterType = typeof(CbArrayConverter<>).MakeGenericType(elementType);
return (CbConverter)Activator.CreateInstance(converterType)!;
}
return null;
}
}
}