using Sandbox.Diagnostics; namespace Sandbox; internal partial class BytePack { /// /// An object[] array. More expensive than a Value array because each type has to write its type /// public class ObjectArrayPacker : Packer { internal override Identifier Header => Identifier.Array; public override void Write( ref ByteStream bs, object obj ) { if ( obj is not Array array ) throw new NotSupportedException(); var et = obj.GetType().GetElementType(); bs.Write( array.Length ); if ( et == typeof( object ) ) { bs.Write( 1 ); for ( int i = 0; i < array.Length; i++ ) { Serialize( ref bs, array.GetValue( i ) ); } return; } bs.Write( 2 ); var h = GetHandlerFor( et ); Assert.NotNull( h, $"Couldn't find or create handler for '{et}'" ); h.WriteTypeIdentifier( ref bs, et ); for ( int i = 0; i < array.Length; i++ ) { h.Serialize( ref bs, array.GetValue( i ) ); } } public override object Read( ref ByteStream bs ) { var len = bs.Read(); var type = bs.Read(); if ( type == 1 ) { var array = new object[len]; for ( int i = 0; i < len; i++ ) { array.SetValue( Deserialize( ref bs ), i ); } return array; } if ( type == 2 ) { var handler = GetHandlerFor( ref bs ); var array = Array.CreateInstance( handler.TargetType, len ); for ( int i = 0; i < len; i++ ) { array.SetValue( handler.Deserialize( ref bs ), i ); } return array; } throw new NotImplementedException(); } } }