diff --git a/imm/Imm.cs b/imm/Imm.cs index 5dd06b3..ddb024b 100644 --- a/imm/Imm.cs +++ b/imm/Imm.cs @@ -67,8 +67,16 @@ public interface Meta public interface Imm { public Meta Meta { get; } + public object Record( string reason = "", + [CallerMemberName] string dbgName = "", + [CallerFilePath] string dbgPath = "", + [CallerLineNumber] int dbgLine = 0 + ); } + + + //[lib.Ser( Types = lib.Types.None )] public record class Versioned : Imm where T : Versioned @@ -93,6 +101,18 @@ public record class Versioned : Imm MetaStorage = meta; } + virtual public T Record( + string reason = "", + [CallerMemberName] string dbgName = "", + [CallerFilePath] string dbgPath = "", + [CallerLineNumber] int dbgLine = 0 + ) + { + return Process( t => t, reason ); + } + + + protected MetaData MetaStorage = new(); [DebuggerBrowsable(DebuggerBrowsableState.Never)] @@ -139,10 +159,14 @@ public record class Versioned : Imm } }; } + + object Imm.Record( string reason, string dbgName, string dbgPath, int dbgLine ) => Record( reason, dbgName, dbgPath, dbgLine ); + + //public object Record( string reason = "", [CallerMemberName] string dbgName = "", [CallerFilePath] string dbgPath = "", [CallerLineNumber] int dbgLine = 0 ) => Recorded( ); } //[lib.Ser( Types = lib.Types.None )] -public record class Recorded : Versioned +public record class Recorded : Versioned, imm.Imm where T : Recorded { @@ -171,7 +195,7 @@ public record class Recorded : Versioned new public MetaData Meta => MetaStorage as MetaData; - virtual public T Record( + override public T Record( string reason = "", [CallerMemberName] string dbgName = "", [CallerFilePath] string dbgPath = "", @@ -230,7 +254,7 @@ public record class Recorded : Versioned } } -public record class Timed : Recorded +public record class Timed : Recorded, imm.Imm where T : Timed { diff --git a/ser/XmlFormatter2.cs b/ser/XmlFormatter2.cs index 33be858..413b266 100644 --- a/ser/XmlFormatter2.cs +++ b/ser/XmlFormatter2.cs @@ -12,6 +12,7 @@ using System.Diagnostics; using System.Linq; using System.Collections.Immutable; +using System.Net.Sockets; /* @@ -177,9 +178,18 @@ namespace lib #region Deserialize private static FormatterConverter s_conv = new(); + private string fromStr = ""; + + void SetFromStr( Stream stream ) + { + fromStr = stream.ToString(); + fromStr = string.IsNullOrWhiteSpace(fromStr) ? (stream as FileStream).Name : fromStr; + fromStr = string.IsNullOrWhiteSpace(fromStr) ? (stream as NetworkStream).Socket.RemoteEndPoint.ToString() : fromStr; + } public object Deserialize( Stream stream ) { + SetFromStr( stream ); return DeserializeKnownType( stream, null ); } @@ -188,6 +198,8 @@ namespace lib public object DeserializeKnownType( Stream stream, Type t ) { + SetFromStr( stream ); + XmlTextReader reader = new( stream ); object obj = Deserialize( reader, t ); @@ -214,6 +226,8 @@ namespace lib public void DeserializeInto( Stream stream, T obj ) { + SetFromStr( stream ); + XmlTextReader reader = new( stream ); reader.Read(); @@ -497,8 +511,10 @@ namespace lib return obj; } - private void HydrateObjectOfNarrowType( XmlElement elem, MemberInfo mi, Type narrowType, object obj ) + private object HydrateObjectOfNarrowType( XmlElement elem, MemberInfo mi, Type narrowType, object obj ) { + var isImm = typeof(imm.Imm).IsAssignableFrom( narrowType ); + XmlNodeList allChildren = elem.ChildNodes; bool filterFields, filterProps, doImpls, doFields, doProps; @@ -618,6 +634,18 @@ namespace lib } } } + + if(!isImm) + { + return obj; + } + else + { + var imm = obj as imm.Imm; + var newObj = imm.Record( $"From XML {fromStr}:{elem.ParentNode?.Name}{elem.Name}" ); + return newObj; + } + } private static bool FilterField( bool filterFields, bool doImpls, HashSet whitelistFields, MemberInfo mi, string name )