// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; using EpicGames.Core; namespace EpicGames.Serialization.Converters { /// /// Converter for list types /// /// class CbListConverter : CbConverter> { /// public override List Read(CbField field) { if (field.IsNull()) { return null!; } else { List list = []; foreach (CbField elementField in field) { list.Add(CbSerializer.Deserialize(elementField)); } return list; } } /// public override void Write(CbWriter writer, List list) { if (list == null) { writer.WriteNullValue(); } else { writer.BeginArray(); foreach (T element in list) { CbSerializer.Serialize(writer, element); } writer.EndArray(); } } /// public override void WriteNamed(CbWriter writer, CbFieldName name, List list) { if (list == null) { writer.WriteNull(name); } else { writer.BeginArray(name); foreach (T element in list) { CbSerializer.Serialize(writer, element); } writer.EndArray(); } } } /// /// Specialization that writes a list as a uniform array of objects - a more efficient representation if you know the elements are always of the same type /// /// public class CbUniformObjectListConverter : CbConverter> { /// public override List Read(CbField field) { if (field.IsNull()) { return null!; } else { List list = []; foreach (CbField elementField in field) { list.Add(CbSerializer.Deserialize(elementField)); } return list; } } /// public override void Write(CbWriter writer, List list) { if (list == null) { writer.WriteNullValue(); } else { writer.BeginUniformArray(CbFieldType.Object); foreach (T element in list) { CbSerializer.Serialize(writer, element); } writer.EndUniformArray(); } } /// public override void WriteNamed(CbWriter writer, CbFieldName name, List list) { if (list == null) { writer.WriteNull(name); } else { writer.BeginUniformArray(name, CbFieldType.Object); foreach (T element in list) { CbSerializer.Serialize(writer, element); } writer.EndUniformArray(); } } } /// /// Specialization for serializing string lists /// sealed class CbStringListConverter : CbConverter> { /// public override List Read(CbField field) { List list = []; foreach (CbField elementField in field) { list.Add(elementField.AsUtf8String()); } return list; } /// public override void Write(CbWriter writer, List list) { writer.BeginUniformArray(CbFieldType.String); foreach (Utf8String str in list) { writer.WriteUtf8StringValue(str); } writer.EndUniformArray(); } /// public override void WriteNamed(CbWriter writer, CbFieldName name, List list) { if (list.Count > 0) { writer.BeginUniformArray(name, CbFieldType.String); foreach (Utf8String str in list) { writer.WriteUtf8StringValue(str); } writer.EndUniformArray(); } } } /// /// Factory for CbListConverter /// class CbListConverterFactory : CbConverterFactory { /// public override CbConverter? CreateConverter(Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { if (type.GenericTypeArguments[0] == typeof(Utf8String)) { return new CbStringListConverter(); } else { Type converterType = typeof(CbListConverter<>).MakeGenericType(type.GenericTypeArguments); return (CbConverter)Activator.CreateInstance(converterType)!; } } return null; } } }