gpt4 book ai didi

c# - 将字节数组序列化为字符串

转载 作者:行者123 更新时间:2023-11-30 23:19:11 25 4
gpt4 key购买 nike

我有一个 IP 地址,我需要在我的代码中将其作为 4 字节数组。但是我想将它作为字符串存储在我的 JSON 设置文件中,格式类似于“192.168.0.1”。那我也想反序列化一下。

我想这样做是因为我的 Settings.json 文件的目标是它是人类可编辑的。

我有办法做到这一点吗?

我正在使用 Newtonsoft JSON 包

我正在序列化的类

public class Settings
{
public string PLCIP;
public byte[] RightTesterIP;
public byte[] LeftTesterIP;
}

我写的转换器方法。只是不确定在哪里实现它们。

private string ConvertIPByteArraytoString(byte[] ip)
{
StringBuilder builder = new StringBuilder();

builder.Append(ip[0]);

for (int i = 1; i < ip.Length; i++)
{
builder.Append(".");
builder.Append(ip[i]);

}
return builder.ToString();
}

private byte[] ConvertIPStringToByteArray(string ip, string ParameterName)
{
var blah = new byte[4];

var split = ip.Split('.');

if (split.Length != 4)
{
//Log.Error("IP Address in settings does not have 4 octets.Number Parsed was {NumOfOCtets}", split.Length);
//throw new SettingsParameterException($"IP Address in settings does not have 4 octets. Number Parsed was {split.Length}");
}

for(int i = 0; i < split.Length; i++)
{
if(!byte.TryParse(split[i], out blah[i]))
{
//var ex = new SettingsParameterException($"Octet {i + 1} of {ParameterName} could not be parsed to byte. Contained \"{split[i]}\"");
//Log.Error(ex,"Octet {i + 1} of {ParameterName} could not be parsed to byte. Contained \"{split[i]}\"", i, ParameterName, split[i]);
//throw ex;
}

}

return blah;
}

最佳答案

你可以在 custom JsonConverter 中完成像这样:

public class IPByteArrayConverter : JsonConverter
{
private static string ConvertIPByteArraytoString(byte[] ip)
{
StringBuilder builder = new StringBuilder();

builder.Append(ip[0]);

for (int i = 1; i < ip.Length; i++)
{
builder.Append(".");
builder.Append(ip[i]);

}
return builder.ToString();
}

private static byte[] ConvertIPStringToByteArray(string ip)
{
var blah = new byte[4];

var split = ip.Split('.');

if (split.Length != 4)
{
//Log.Error("IP Address in settings does not have 4 octets.Number Parsed was {NumOfOCtets}", split.Length);
//throw new SettingsParameterException($"IP Address in settings does not have 4 octets. Number Parsed was {split.Length}");
}

for (int i = 0; i < split.Length; i++)
{
if (!byte.TryParse(split[i], out blah[i]))
{
//var ex = new SettingsParameterException($"Octet {i + 1} of {ParameterName} could not be parsed to byte. Contained \"{split[i]}\"");
//Log.Error(ex,"Octet {i + 1} of {ParameterName} could not be parsed to byte. Contained \"{split[i]}\"", i, ParameterName, split[i]);
//throw ex;
}

}

return blah;
}

public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var token = JToken.Load(reader);
if (token.Type == JTokenType.Bytes)
return (byte[])token;
return ConvertIPStringToByteArray((string)token);
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var bytes = (byte[])value;
writer.WriteValue(ConvertIPByteArraytoString(bytes));
}
}

然后您可以使用 [JsonConverter(IPByteArrayConverter)] 将其附加到适当的属性或字段:

public class Settings
{
public string PLCIP;
[JsonConverter(typeof(IPByteArrayConverter))]
public byte[] RightTesterIP;
[JsonConverter(typeof(IPByteArrayConverter))]
public byte[] LeftTesterIP;
}

样本 fiddle .

更新

使用 IPAddress正如@Greg 所建议的那样,您可以获得对 IPV6 和 IPV4 的支持。这种类型的 JsonConverter 看起来像:

public class IPAddressConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(IPAddress).IsAssignableFrom(objectType);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var token = JToken.Load(reader);
if (token.Type == JTokenType.Bytes)
{
var bytes = (byte[])token;
return new IPAddress(bytes);
}
else
{
var s = (string)token;
return IPAddress.Parse(s);
}
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var ip = (IPAddress)value;
writer.WriteValue(ip.ToString());
}
}

然后像以前一样将其应用于Settings类,或者在JsonSerializerSettings.Converters中全局使用它:

var jsonSettings = new JsonSerializerSettings
{
Converters = new [] { new IPAddressConverter() },
};

var json = JsonConvert.SerializeObject(settings, jsonSettings);

使用类:

public class Settings
{
public string PLCIP;
public IPAddress RightTesterIP;
public IPAddress LeftTesterIP;
}

样本 fiddle .

关于c# - 将字节数组序列化为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40430037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com