From 0c37db10b5d86e50f53f97ae181eaf50cb477cec Mon Sep 17 00:00:00 2001 From: Marc Hernandez Date: Thu, 2 May 2024 18:27:28 -0700 Subject: [PATCH] Better showing templates x) Remove oid x) Make res ? x) Dont show types when the type is the same as its enclosing type --- imm/Imm.cs | 9 ++---- res/Resource.cs | 4 +-- ser/XmlFormatter2.cs | 75 ++++++++++++++++++++++++++++++++------------ 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/imm/Imm.cs b/imm/Imm.cs index f4dc083..5dd06b3 100644 --- a/imm/Imm.cs +++ b/imm/Imm.cs @@ -100,9 +100,6 @@ public record class Versioned : Imm Meta Imm.Meta => MetaStorage; - ObjectIDGenerator oIdGen = new(); - - [lib.Dont] [DebuggerBrowsable(DebuggerBrowsableState.Never)] internal ChangeDelegate OnChange = (old, cur) => {}; @@ -114,8 +111,7 @@ public record class Versioned : Imm [CallerLineNumber] int dbgLine = 0 ) { - var oid = oIdGen.GetId( fn, out var firstTime ); - log.debug( $"ADD {oid}/{firstTime} {log.whatFile(dbgPath)}({dbgLine}): {dbgName} added OnChange bcs {reason}" ); + log.debug( $"ADD {log.whatFile(dbgPath)}({dbgLine}): {dbgName} added OnChange bcs {reason}" ); OnChange += fn; } @@ -125,8 +121,7 @@ public record class Versioned : Imm [CallerLineNumber] int dbgLine = 0 ) { - var oid = oIdGen.GetId( fn, out var firstTime ); - log.debug( $"REM {oid}/{firstTime}{log.whatFile(dbgPath)}({dbgLine}): {dbgName} removing OnChange" ); + log.debug( $"REM {log.whatFile(dbgPath)}({dbgLine}): {dbgName} removing OnChange" ); OnChange -= fn; } diff --git a/res/Resource.cs b/res/Resource.cs index 6e22a32..e65b784 100644 --- a/res/Resource.cs +++ b/res/Resource.cs @@ -59,7 +59,7 @@ namespace res [Serializable] public class Ref : Ref where T : class { - public T res => m_res != null ? m_res : ( m_res = Mgr.load( Filename ) ); + public T? res => m_res != null ? m_res : ( m_res = Mgr.load( Filename ) ); //For serialization public Ref() @@ -254,7 +254,7 @@ namespace res } //*/ - static public T load( string filename ) where T : class + static public T? load( string filename ) where T : class { if( ResCache.s_cache.TryGetValue( filename, out var wr ) ) { diff --git a/ser/XmlFormatter2.cs b/ser/XmlFormatter2.cs index ee5702e..33be858 100644 --- a/ser/XmlFormatter2.cs +++ b/ser/XmlFormatter2.cs @@ -978,10 +978,10 @@ namespace lib public void Serialize( Stream stream, object root ) { - Serialize( stream, null, root ); + Serialize( stream, null, typeof( object ), root ); } - public void Serialize( Stream stream, MemberInfo mi, object root ) + public void Serialize( Stream stream, MemberInfo mi, Type mType, object root ) { //lib.log.info( "Serialize( Stream stream, object root ) {0} {1}", m_rndVal, m_alreadySerialized.Count ); @@ -992,7 +992,7 @@ namespace lib writer.Formatting = Formatting.Indented; - Serialize( writer, mi, root ); + Serialize( writer, mi, mType, root ); //Rely on the parent closing the stream. //writer.Close(); @@ -1001,14 +1001,14 @@ namespace lib //lib.log.info( "Serialize END ( Stream stream, object root ) {0} {1}", m_rndVal, m_alreadySerialized.Count ); } - private void Serialize( XmlWriter writer, MemberInfo mi, object root ) + private void Serialize( XmlWriter writer, MemberInfo mi, Type mType, object root ) { //writer.WriteStartDocument(); - Serialize( writer, mi, root, "root", 1, true ); + Serialize( writer, mi, mType, root, "root", 1, true ); //writer.WriteEndDocument(); } - private void Serialize( XmlWriter writer, MemberInfo mi, object root, string name, int depth, bool forceType ) + private void Serialize( XmlWriter writer, MemberInfo mi, Type mType, object root, string name, int depth, bool forceType ) { if( root != null ) { @@ -1035,16 +1035,16 @@ namespace lib { if( IsEnumerable( type ) ) { - SerializeCollection( writer, mi, root, depth ); + SerializeCollection( writer, mi, mType, root, depth ); } else { - SerializeObject( writer, mi, root, depth ); + SerializeObject( writer, mi, mType, root, depth ); } } else { - SerializeArray( writer, mi, root, depth ); + SerializeArray( writer, mi, mType, root, depth ); } } } @@ -1065,6 +1065,7 @@ namespace lib { if( forceType ) writer.WriteAttributeString( "_.t", getTypeName( root.GetType() ) ); + writer.WriteAttributeString( "v", root.ToString() ); } else @@ -1073,7 +1074,7 @@ namespace lib } } - private void SerializeCollection( XmlWriter writer, MemberInfo mi, object root, int depth ) + private void SerializeCollection( XmlWriter writer, MemberInfo? mi, Type mType, object root, int depth ) { IEnumerable it = root as IEnumerable; @@ -1083,7 +1084,11 @@ namespace lib Type type = root.GetType(); - writer.WriteAttributeString( "_.t", getTypeName( type ) ); + if( mType != type ) + { + log.info( $"Coll: {mType.Name} {mi?.Name} != {type.Name}" ); + writer.WriteAttributeString( "_.t", getTypeName( type ) ); + } bool first; @@ -1104,16 +1109,24 @@ namespace lib int i = 0; foreach( var v in it ) { - Serialize( writer, mi, v, "i" + i.ToString(), depth + 1, false ); + Serialize( writer, null, typeElem, v, "i" + i.ToString(), depth + 1, false ); ++i; } } } - private void SerializeObject( XmlWriter writer, MemberInfo mi, object root, int depth ) + private void SerializeObject( XmlWriter writer, MemberInfo mi, Type mType, object root, int depth ) { - writer.WriteAttributeString( "_.t", getTypeName( root.GetType() ) ); + if( mType != root.GetType() ) + { + var rType = root.GetType(); + var rTypeName = !rType.IsNested ? rType.Name : $"{rType.DeclaringType.Name}.{rType.Name}"; + var mTypeName = !mType.IsNested ? mType.Name : $"{mType.DeclaringType.Name}.{mType.Name}"; + var rootTypeName = !mType.IsNested ? mType.Name : $"{mType.DeclaringType.Name}.{mType.Name}"; + log.info( $"SerObj {mTypeName} != {rTypeName}" ); + writer.WriteAttributeString( "_.t", getTypeName( root.GetType() ) ); + } if( depth == 1 ) { @@ -1159,7 +1172,7 @@ namespace lib name = refl.TypeToIdentifier( name ); - Serialize( writer, mi, serMember.Value, name, depth, true ); + Serialize( writer, mi, mType, serMember.Value, name, depth, true ); } return; @@ -1200,6 +1213,8 @@ namespace lib HashSet whitelistFields, whitelistProps; GetFilters( _cfg.TypesDefault, mi, narrowType, out filterFields, out filterProps, out doImpls, out doFields, out doProps, out whitelistFields, out whitelistProps ); + var isImm = typeof(imm.Imm).IsAssignableFrom( narrowType ); + if( doFields || doImpls ) { var fields = refl.GetAllFields( narrowType ); @@ -1227,6 +1242,12 @@ namespace lib continue; } + if( isImm ) + { + if( name == "MetaStorage" ) continue; + if( name == "Fn" ) continue; + } + if( FilterField( filterFields, doImpls, whitelistFields, childFi as MemberInfo, name ) ) continue; @@ -1245,7 +1266,7 @@ namespace lib propName : name; - Serialize( writer, childFi, childFi.GetValue( root ), finalName, depth + 1, false ); + Serialize( writer, childFi, childFi.FieldType, childFi.GetValue( root ), finalName, depth + 1, false ); } } @@ -1263,6 +1284,12 @@ namespace lib continue; } + if( isImm ) + { + if( name == "MetaStorage" ) continue; + if( name == "Fn" ) continue; + } + if( FilterField( filterProps, doImpls, whitelistProps, childPi as MemberInfo, name ) ) continue; @@ -1275,7 +1302,7 @@ namespace lib name = refl.TypeToIdentifier( name ); - Serialize( writer, childPi, childPi.GetValue( root ), name, depth + 1, false ); + Serialize( writer, childPi, childPi.PropertyType, childPi.GetValue( root ), name, depth + 1, false ); } } @@ -1298,7 +1325,7 @@ namespace lib whitelistProps = new( custWLProps?.Values ?? new string[0] ); } - private void SerializeArray( XmlWriter writer, MemberInfo mi, object root, int depth ) + private void SerializeArray( XmlWriter writer, MemberInfo mi, Type mType, object root, int depth ) { Array arr = (Array)root; @@ -1306,7 +1333,14 @@ namespace lib Type type = root.GetType(); - writer.WriteAttributeString( "_.t", getTypeName( type ) ); + Type typeOfMember = typeof( object ); + if( mi is FieldInfo fi ) typeOfMember = fi.FieldType; + if( mi is PropertyInfo pi ) typeOfMember = pi.PropertyType; + if( typeOfMember != type ) + { + log.info( $"SerArr {typeOfMember.Name} {mi?.Name} != {type.Name}" ); + writer.WriteAttributeString( "_.t", getTypeName( type ) ); + } bool first; @@ -1324,10 +1358,11 @@ namespace lib m_alreadySerialized[refInt] = root; } + //typeElem.MemberType for( int i = 0; i < arr.Length; ++i ) { - Serialize( writer, mi, arr.GetValue( i ), "i" + i.ToString(), depth + 1, false ); + Serialize( writer, mi, typeElem, arr.GetValue( i ), "i" + i.ToString(), depth + 1, false ); } } }