bug

maurice · 25 days ago

Le jeu n'a pas pu se charger car le fichier de sauvegarde est corrompu. Si ce problème persiste, veuillez remplir un rapport de bug.

Mafi.Serialization.CorruptedSaveException: Failed to finalize deserialization of 'RocketTradeMod.RocketTradeManager' (type 'RocketTradeManager')
parent object '--' (type '--')
Previous deserialized in this finalize call: 'Mafi.Core.Buildings.Cargo.TradeDockManager' (type 'TradeDockManager')
Last deserialized across all finalize calls: 'Mafi.Core.Buildings.Cargo.TradeDockManager' (type 'TradeDockManager')
Last read object types: [Dic2, Dict2, Dict`2] ---> System.ArgumentNullException: Value cannot be null.
Parameter name: obj
at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_monitor_enter_v4_internal(object,intptr)
at RocketTradeMod.RocketTradeManager.DeserializeData (Mafi.Serialization.BlobReader reader) [0x00009]
at RocketTradeMod.RocketTradeManager+<>c.<.cctor>b__43_1 (System.Object obj, Mafi.Serialization.BlobReader reader) [0x00000]
at Mafi.Serialization.BlobReader+<FinalizeLoadingTimeSliced>d__44.MoveNext () [0x00054]
--- End of inner exception stack trace ---
at Mafi.Serialization.BlobReader+<FinalizeLoadingTimeSliced>d__44.MoveNext () [0x00202]
at Mafi.Core.SaveGame.GameLoader+<FinishGameLoadAndDisposeTimeSliced>d__12.MoveNext () [0x004ef]
at Mafi.Core.Game.GameBuilder+<BuildLoadedGameTimeSliced>d__1.MoveNext () [0x005a4]
at Mafi.Unity.GamePlayScene+<loadGame>d__28.MoveNext () [0x002ca]
at Mafi.Unity.GamePlayScene+<Initialize>d__25.MoveNext () [0x000ad]
at Mafi.Unity.Main+<unloadAndStartNewScene>d__117.MoveNext () [0x0013b]
at Mafi.Unity.Main.stepSceneInitialization () [0x00104]

Game version: 0.8.7d
Loaded mods: (Trains expansion 1.0.0), (Supporter edition 1.1.0), (Ambient Sea Traffic 1.0.7), (Bagger 288 0.7.8), (Beacon & Government+ 1.1.0c), (Union Pacific Big Boy 1.0.5), (Cargo Helicopter 0.20.0), (Coastal Immigration Beacon 0.2.16), (Custom Assets Loader 0.4.2), (Coal Liquefaction [CAL] 0.0.3), (Filiere Bois Responsable - Granules 0.2.0), (Weather Plus (dev) 0.1.0), (Hide Blocked Ports 0.1.1), (Kayser's Pre-Industrial Era 0.4.1), (Nuclear locomotive II 1.0.1), (Physical Trade Ship 0.2.22), (Products Texture 0.0.3), (Retaining Walls Never Die 1.0.1), (Rocket Trade Mod 火箭贸易 0.0.6), (ShipAutoExplore 0.1.0), (Wind turbines 0.1.11a), (世界矿山mod 2.0.1), (水利发电 Hydro Power 1.0.0), (新电力列车 1.1.0), (Procedural Research Tree 0.3.1)
Failed mods: none

maurice · 25 days ago

J'ai corrigé directement la DLL du mod.

La cause, confirmée en décompilant le mod : au chargement, COI recrée le RocketTradeManager sans passer par son constructeur. Les 8 champs que ce constructeur remplit restent donc null : le verrou m_syncRoot et toutes les listes (contrats des pas de tir, maintenance, vols en cours…). DeserializeData fait un lock(m_syncRoot) dès sa première ligne et plante. Même si le verrou passait, il planterait juste après sur m_padContracts.Clear(). Le bug touche donc toute sauvegarde où le mod est présent. Le mod est sorti le 29/09 (version 0.0.6) et l'auteur n'a sans doute testé qu'en nouvelle partie.

wtmxhyy wtmxhyy · 24 days ago

maurice 说得完全正确。COI 读档时反序列化框架(FormatterServices 方式) 绕过构造函数 直接重建[ManuallyWrittenSerialization] 服务类,字段初始化器不执行—— RocketTradeManager 的 8 个实例字段(m_syncRoot 、6 个字典、m_hiddenRockets )全部为 null,DeserializeData 第一行lock(m_syncRoot) 就抛ArgumentNullException ,存档被判损坏。 凡含 0.0.6 的存档读档必崩 ,不是个别存档问题。

修复内容

  • 8 个字段去掉readonly 与字段初始化器,新增惰性EnsureInit() ,在DeserializeData /SerializeData /initSelf 三个序列化入口最先调用补齐。
  • 序列化数据格式 未变 ,0.0.6 旧存档直接可读(玩家那个"损坏"存档没坏,更新模组后即可正常读取)。
  • 排查了 TradeRocketLaunchPad :实体由 DI 工厂重建,构造函数正常执行,不受此类问题影响,无需改动。
wtmxhyy wtmxhyy · 24 days ago

感谢提醒,已经更新0.07版本,发布匆忙,没有充分做存档测试,实在抱歉。感谢你的反馈。

48 Showing 1–4 of 4