diff --git a/v2rayN/ServiceLib/Common/JsonUtils.cs b/v2rayN/ServiceLib/Common/JsonUtils.cs
index 4d0f8e71..cf5ec25c 100644
--- a/v2rayN/ServiceLib/Common/JsonUtils.cs
+++ b/v2rayN/ServiceLib/Common/JsonUtils.cs
@@ -70,8 +70,9 @@ namespace ServiceLib.Common
///
///
///
+ ///
///
- public static string Serialize(object? obj, bool indented = true)
+ public static string Serialize(object? obj, bool indented = true, bool nullValue = false)
{
var result = string.Empty;
try
@@ -82,8 +83,8 @@ namespace ServiceLib.Common
}
var options = new JsonSerializerOptions
{
- WriteIndented = indented ? true : false,
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
+ WriteIndented = indented,
+ DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull
};
result = JsonSerializer.Serialize(obj, options);
}
@@ -100,38 +101,5 @@ namespace ServiceLib.Common
///
///
public static JsonNode? SerializeToNode(object? obj) => JsonSerializer.SerializeToNode(obj);
-
- ///
- /// Save as json file
- ///
- ///
- ///
- ///
- ///
- public static int ToFile(object? obj, string? filePath, bool nullValue = true)
- {
- if (filePath is null)
- {
- return -1;
- }
- try
- {
- using var file = File.Create(filePath);
-
- var options = new JsonSerializerOptions
- {
- WriteIndented = true,
- DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull
- };
-
- JsonSerializer.Serialize(file, obj, options);
- return 0;
- }
- catch (Exception ex)
- {
- Logging.SaveLog(ex.Message, ex);
- return -1;
- }
- }
}
}
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs
index 8c066868..39d6cb1c 100644
--- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs
+++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs
@@ -9,7 +9,6 @@ namespace ServiceLib.Handler
public class ConfigHandler
{
private static readonly string _configRes = Global.ConfigFileName;
- private static readonly object _objLock = new();
#region ConfigHandler
@@ -67,7 +66,6 @@ namespace ServiceLib.Handler
}
config.RoutingBasicItem ??= new();
-
if (Utils.IsNullOrEmpty(config.RoutingBasicItem.DomainStrategy))
{
config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First();//"IPIfNonMatch";
@@ -120,15 +118,6 @@ namespace ServiceLib.Handler
}
config.ConstItem ??= new ConstItem();
- if (Utils.IsNotEmpty(config.ConstItem.DefIEProxyExceptions))
- {
- config.SystemProxyItem.SystemProxyExceptions = $"{config.ConstItem.DefIEProxyExceptions};{config.SystemProxyItem.SystemProxyExceptions}";
- config.ConstItem.DefIEProxyExceptions = string.Empty;
- }
- if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
- {
- config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
- }
config.SpeedTestItem ??= new();
if (config.SpeedTestItem.SpeedTestTimeout < 10)
@@ -167,6 +156,16 @@ namespace ServiceLib.Handler
config.WebDavItem ??= new();
config.CheckUpdateItem ??= new();
+ if (Utils.IsNotEmpty(config.ConstItem.DefIEProxyExceptions))
+ {
+ config.SystemProxyItem.SystemProxyExceptions = $"{config.ConstItem.DefIEProxyExceptions};{config.SystemProxyItem.SystemProxyExceptions}";
+ config.ConstItem.DefIEProxyExceptions = string.Empty;
+ }
+ if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
+ {
+ config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
+ }
+
return config;
}
@@ -177,30 +176,26 @@ namespace ServiceLib.Handler
///
public static async Task SaveConfig(Config config)
{
- lock (_objLock)
+ try
{
- try
- {
- //save temp file
- var resPath = Utils.GetConfigPath(_configRes);
- var tempPath = $"{resPath}_temp";
- if (JsonUtils.ToFile(config, tempPath) != 0)
- {
- return -1;
- }
+ //save temp file
+ var resPath = Utils.GetConfigPath(_configRes);
+ var tempPath = $"{resPath}_temp";
- if (File.Exists(resPath))
- {
- File.Delete(resPath);
- }
- //rename
- File.Move(tempPath, resPath);
- }
- catch (Exception ex)
+ var content = JsonUtils.Serialize(config, true, true);
+ if (content.IsNullOrEmpty())
{
- Logging.SaveLog("ToJsonFile", ex);
return -1;
}
+ await File.WriteAllTextAsync(tempPath, content);
+
+ //rename
+ File.Move(tempPath, resPath, true);
+ }
+ catch (Exception ex)
+ {
+ Logging.SaveLog("ToJsonFile", ex);
+ return -1;
}
return 0;
diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs
index 202b5089..e1f26b1b 100644
--- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs
+++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs
@@ -409,7 +409,9 @@ namespace ServiceLib.Services.CoreConfig
{
await GenInbounds(singboxConfig);
await GenExperimental(singboxConfig);
- JsonUtils.ToFile(singboxConfig, fileName, false);
+
+ var content = JsonUtils.Serialize(singboxConfig, true);
+ await File.WriteAllTextAsync(fileName, content);
}
}
else
diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs
index 9b016ca6..ff680c3d 100644
--- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs
+++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs
@@ -282,16 +282,16 @@ namespace ServiceLib.ViewModels
{
try
{
- Logging.SaveLog("MyAppExit Begin");
- await SysProxyHandler.UpdateSysProxy(_config, true);
+ Logging.SaveLog("MyAppExitAsync Begin");
await ConfigHandler.SaveConfig(_config);
+ await SysProxyHandler.UpdateSysProxy(_config, true);
await ProfileExHandler.Instance.SaveTo();
await StatisticsHandler.Instance.SaveTo();
StatisticsHandler.Instance.Close();
await CoreHandler.Instance.CoreStop();
- Logging.SaveLog("MyAppExit End");
+ Logging.SaveLog("MyAppExitAsync End");
}
catch { }
finally