sharplib/cfg/Config.cs
Marc Hernandez 3f850cc9b0 Implement Xml Serialization Framework with Type Handling and Metadata Caching
- Introduced XmlSer class for XML serialization and deserialization.
- Added TypeMetaCache for caching type metadata and reflection information.
- Implemented various ITypeHandler implementations for handling different types (Primitive, Proxy, ISerializable, Collection, Object).
- Enhanced type resolution with TypeResolver to manage type lookups and conversions.
- Established a configuration class (XmlCfg) to manage serialization settings.
- Integrated support for handling graphs and references in serialized objects.
- Added extensive member processing and filtering based on attributes.
- Ensured compatibility with immutable collections and various data structures.
- Implemented detailed error handling and logging for serialization processes.
2025-05-28 10:46:00 -07:00

184 lines
3.1 KiB
C#

using System;
using System.IO;
using System.Xml;
using System.Reflection;
/*
TODO:
x)
*/
namespace lib
{
public class DescAttribute : Attribute
{
public string Desc { get; private set; }
public DescAttribute( string desc )
{
Desc = desc;
}
}
[Serializable]
public class ConfigCfg : Config
{
public readonly bool writeOutTemplateFiles = true;
}
public interface ConfigBase
{
}
public record class ConfigRec : ConfigBase
{
}
public class Config : ConfigBase
{
//private int _test = 0;
private static lib.XmlFormatter2Cfg s_templateCfg = new() {
datastructure = Datastructure.Tree,
POD = POD.Elements,
};
private static ConfigCfg s_cfg = new();
static public void startup( string filename )
{
res.Mgr.Register( load );
res.Mgr.RegisterSub( typeof( ConfigBase ) );
s_cfg = load<ConfigCfg>( filename );
}
#region SaveLoad
static public T res_load<T>( string filename ) where T : Config
{
return load<T>( filename );
}
static public Config load( string filename )
{
return load( filename, null );
}
static public T load<T>( string filename ) where T : Config
{
return (T)load( filename, typeof( T ) );
}
static public Config load( string filename, Type t )
{
Config cfg = null;
try
{
if( File.Exists( filename ) )
{
FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read );
XmlFormatter2 formatter = new XmlFormatter2();
cfg = (Config)( t != null ? formatter.DeserializeKnownType( fs, t ) : formatter.Deserialize( fs ) );
cfg.SetFilename( filename );
}
else
{
cfg = CreateTemplate( filename, t );
}
}
catch( IOException )
{
cfg = CreateTemplate( filename, t );
}
return cfg;
}
private static Config CreateTemplate( string filename, Type t )
{
Type[] types = new Type[0];
object[] parms = new object[0];
//types[ 0 ] = typeof( string );
//parms[ 0 ] = filename;
Config cfg = null;
ConstructorInfo cons = t?.GetConstructor( types );
try
{
cfg = (Config)cons?.Invoke( parms );
}
catch( Exception e )
{
log.error( $"Exception while creating config {t.ToString()}, Msg {e.Message}" );
}
//cfg.SetFilename( filename );
if( s_cfg.writeOutTemplateFiles )
{
var templateFile = $"templates/{filename}";
var dirName = Path.GetDirectoryName( templateFile );
Util.checkAndAddDirectory( dirName );
log.info( $"Writing out template config of type {t?.Name} in {templateFile}" );
save( cfg, templateFile );
}
return cfg;
}
static public void save( Config cfg )
{
save( cfg, cfg._filename );
}
static public void save( Config cfg, String filename )
{
FileStream fs = new( filename, FileMode.Create, FileAccess.Write );
XmlFormatter2 formatter = new();
formatter.Serialize( fs, cfg );
fs.Close();
}
#endregion
private string _filename = "{unknown}";
public Config()
{
}
public Config( string filename )
{
_filename = filename;
}
public String Filename { get { return _filename; } }
protected void SetFilename( String filename ) { _filename = filename; }
}
}