@@ -33,24 +33,39 @@ public static int HandleExternalRefs(FileInfo filename, OutputFormat format)
3333
3434 public static int HandleObjectList ( FileInfo filename , OutputFormat format )
3535 {
36- if ( ! ValidateSerializedFile ( filename . FullName , out _ ) )
36+ // The object list is read directly from the parsed metadata rather than via UnityFileSystemApi.
37+ //
38+ // Advantages: works for any modern SerializedFile (version >= 19), including Player builds
39+ // that were compiled without TypeTrees — files that UnityFileSystemApi cannot open at all.
40+ //
41+ // Trade-offs: type names come from TypeIdRegistry rather than the file's embedded TypeTree,
42+ // so uncommon types not covered by the registry are displayed as a numeric TypeId. Files
43+ // older than version 19 (Unity 2019.1) are not supported by the metadata parser.
44+ //
45+ // These trade-offs are minor compared to the benefit of handling the common no-TypeTree case,
46+ // so there is no need to keep the UnityFileSystemApi code path.
47+ if ( ! ValidateSerializedFile ( filename . FullName , out var fileInfo ) )
3748 return 1 ;
3849
39- try
50+ if ( ! SerializedFileDetector . TryParseMetadata ( filename . FullName , fileInfo , out var metadata , out var errorMessage ) )
4051 {
41- using var sf = UnityFileSystem . OpenSerializedFile ( filename . FullName ) ;
42- if ( format == OutputFormat . Json )
43- OutputObjectListJson ( sf ) ;
44- else
45- OutputObjectListText ( sf ) ;
46- return 0 ;
52+ Console . Error . WriteLine ( $ "Error: Failed to parse object list for: { filename . FullName } ") ;
53+ Console . Error . WriteLine ( errorMessage ) ;
54+ return 1 ;
4755 }
48- catch ( Exception err ) when ( err is NotSupportedException || err is FileFormatException )
56+
57+ if ( metadata . ObjectList == null )
4958 {
50- Console . Error . WriteLine ( $ "Error opening SerializedFile: { filename . FullName } ") ;
51- Console . Error . WriteLine ( err . Message ) ;
59+ Console . Error . WriteLine ( $ "Error: Object list could not be parsed for: { filename . FullName } ") ;
5260 return 1 ;
5361 }
62+
63+ if ( format == OutputFormat . Json )
64+ OutputObjectListJson ( metadata . ObjectList ) ;
65+ else
66+ OutputObjectListText ( metadata . ObjectList ) ;
67+
68+ return 0 ;
5469 }
5570
5671 public static int HandleHeader ( FileInfo filename , OutputFormat format )
@@ -167,36 +182,27 @@ private static void OutputExternalRefsJson(SerializedFile sf)
167182 Console . WriteLine ( json ) ;
168183 }
169184
170- private static void OutputObjectListText ( SerializedFile sf )
185+ private static void OutputObjectListText ( ObjectInfo [ ] objects )
171186 {
172- var objects = sf . Objects ;
173-
174- // Print header
175187 Console . WriteLine ( $ "{ "Id" , - 20 } { "Type" , - 40 } { "Offset" , - 15 } { "Size" , - 15 } ") ;
176188 Console . WriteLine ( new string ( '-' , 90 ) ) ;
177189
178190 foreach ( var obj in objects )
179- {
180- string typeName = GetTypeName ( sf , obj ) ;
181- Console . WriteLine ( $ "{ obj . Id , - 20 } { typeName , - 40 } { obj . Offset , - 15 } { obj . Size , - 15 } ") ;
182- }
191+ Console . WriteLine ( $ "{ obj . Id , - 20 } { TypeIdRegistry . GetTypeName ( obj . TypeId ) , - 40 } { obj . Offset , - 15 } { obj . Size , - 15 } ") ;
183192 }
184193
185- private static void OutputObjectListJson ( SerializedFile sf )
194+ private static void OutputObjectListJson ( ObjectInfo [ ] objects )
186195 {
187- var objects = sf . Objects ;
188- var jsonArray = new object [ objects . Count ] ;
196+ var jsonArray = new object [ objects . Length ] ;
189197
190- for ( int i = 0 ; i < objects . Count ; i ++ )
198+ for ( int i = 0 ; i < objects . Length ; i ++ )
191199 {
192200 var obj = objects [ i ] ;
193- string typeName = GetTypeName ( sf , obj ) ;
194-
195201 jsonArray [ i ] = new
196202 {
197203 id = obj . Id ,
198204 typeId = obj . TypeId ,
199- typeName = typeName ,
205+ typeName = TypeIdRegistry . GetTypeName ( obj . TypeId ) ,
200206 offset = obj . Offset ,
201207 size = obj . Size
202208 } ;
@@ -206,21 +212,6 @@ private static void OutputObjectListJson(SerializedFile sf)
206212 Console . WriteLine ( json ) ;
207213 }
208214
209- private static string GetTypeName ( SerializedFile sf , ObjectInfo obj )
210- {
211- try
212- {
213- // Try to get type name from TypeTree first (most accurate)
214- var root = sf . GetTypeTreeRoot ( obj . Id ) ;
215- return root . Type ;
216- }
217- catch
218- {
219- // Fall back to registry if TypeTree is not available
220- return TypeIdRegistry . GetTypeName ( obj . TypeId ) ;
221- }
222- }
223-
224215 private static void OutputHeaderText ( SerializedFileInfo info )
225216 {
226217 Console . WriteLine ( $ "{ "Version" , - 20 } { info . Version } ") ;
0 commit comments