@@ -239,32 +239,76 @@ public void Save(string path, string encoding, int encoding_version)
239239 /// </summary>
240240 /// <param name="stream">The input Stream.</param>
241241 /// <param name="defer_mode">How to handle deferred loading.</param>
242- public static Datamodel Load ( Stream stream , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
242+ public static Datamodel Load ( Stream stream , DeferredMode defer_mode = DeferredMode . Automatic )
243243 {
244- return Load_Internal ( stream , Assembly . GetCallingAssembly ( ) , defer_mode , reflectionParams ) ;
244+ return Load_Internal < Element > ( stream , Assembly . GetCallingAssembly ( ) , defer_mode , null ) ;
245245 }
246246 /// <summary>
247- /// Loads a Datamodel from a byte array .
247+ /// Loads a Datamodel from a <see cref="Stream"/> .
248248 /// </summary>
249249 /// <param name="stream">The input Stream.</param>
250250 /// <param name="defer_mode">How to handle deferred loading.</param>
251- public static Datamodel Load ( byte [ ] data , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
251+ /// <typeparam name="T">Type hint for what the Root of this datamodel should be when using reflection</param>
252+ public static Datamodel Load < T > ( Stream stream , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
253+ where T : Element
252254 {
253- return Load_Internal ( new MemoryStream ( data , true ) , Assembly . GetCallingAssembly ( ) , defer_mode , reflectionParams ) ;
255+ return Load_Internal < T > ( stream , Assembly . GetCallingAssembly ( ) , defer_mode , reflectionParams ) ;
256+ }
257+
258+ /// <summary>
259+ /// Loads a Datamodel from a byte array.
260+ /// </summary>
261+ /// <param name="data">The input byte array.</param>
262+ /// <param name="defer_mode">How to handle deferred loading.</param>
263+ public static Datamodel Load ( byte [ ] data , DeferredMode defer_mode = DeferredMode . Automatic )
264+ {
265+ return Load_Internal < Element > ( new MemoryStream ( data , true ) , Assembly . GetCallingAssembly ( ) , defer_mode ) ;
266+ }
267+ /// <summary>
268+ /// Loads a Datamodel from a byte array.
269+ /// </summary>
270+ /// <param name="data">The input byte array.</param>
271+ /// <param name="defer_mode">How to handle deferred loading.</param>
272+ /// <typeparam name="T">Type hint for what the Root of this datamodel should be when using reflection</param>
273+ public static Datamodel Load < T > ( byte [ ] data , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
274+ where T : Element
275+ {
276+ return Load_Internal < T > ( new MemoryStream ( data , true ) , Assembly . GetCallingAssembly ( ) , defer_mode , reflectionParams ) ;
254277 }
255278
256279 /// <summary>
257280 /// Loads a Datamodel from a file path.
258281 /// </summary>
259282 /// <param name="path">The source file path.</param>
260283 /// <param name="defer_mode">How to handle deferred loading.</param>
261- public static Datamodel Load ( string path , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
284+ public static Datamodel Load ( string path , DeferredMode defer_mode = DeferredMode . Automatic )
262285 {
263286 var stream = File . OpenRead ( path ) ;
264287 Datamodel ? dm = null ;
265288 try
266289 {
267- dm = Load_Internal ( stream , Assembly . GetCallingAssembly ( ) , defer_mode , reflectionParams ) ;
290+ dm = Load_Internal < Element > ( stream , Assembly . GetCallingAssembly ( ) , defer_mode ) ;
291+ return dm ;
292+ }
293+ finally
294+ {
295+ if ( defer_mode == DeferredMode . Disabled || ( dm != null && dm . Codec == null ) ) stream . Dispose ( ) ;
296+ }
297+ }
298+ /// <summary>
299+ /// Loads a Datamodel from a file path.
300+ /// </summary>
301+ /// <param name="path">The source file path.</param>
302+ /// <param name="defer_mode">How to handle deferred loading.</param>
303+ /// <typeparam name="T">Type hint for what the Root of this datamodel should be when using reflection</param>
304+ public static Datamodel Load < T > ( string path , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
305+ where T : Element
306+ {
307+ var stream = File . OpenRead ( path ) ;
308+ Datamodel ? dm = null ;
309+ try
310+ {
311+ dm = Load_Internal < T > ( stream , Assembly . GetCallingAssembly ( ) , defer_mode , reflectionParams ) ;
268312 return dm ;
269313 }
270314 finally
@@ -273,9 +317,16 @@ public static Datamodel Load(string path, DeferredMode defer_mode = DeferredMode
273317 }
274318 }
275319
276- private static Datamodel Load_Internal ( Stream stream , Assembly callingAssembly , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
320+ private static Datamodel Load_Internal < T > ( Stream stream , Assembly callingAssembly , DeferredMode defer_mode = DeferredMode . Automatic , ReflectionParams ? reflectionParams = null )
321+ where T : Element
277322 {
278- reflectionParams ??= new ( ) ;
323+ reflectionParams ??= new ( ) ;
324+
325+ if ( typeof ( T ) == typeof ( Element ) )
326+ {
327+ reflectionParams . AttemptReflection = false ;
328+ }
329+
279330 reflectionParams . AssembliesToSearch . Add ( callingAssembly ) ;
280331
281332 stream . Seek ( 0 , SeekOrigin . Begin ) ;
@@ -316,6 +367,8 @@ private static Datamodel Load_Internal(Stream stream, Assembly callingAssembly,
316367 dm . Encoding = encoding ;
317368 dm . EncodingVersion = encoding_version ;
318369
370+ dm . Root = ( T ? ) dm . Root ;
371+
319372 return dm ;
320373 }
321374
0 commit comments