BaseEntityConverter的示例代码

This commit is contained in:
milimoe 2023-07-31 23:04:39 +08:00
parent dccedd3546
commit 040a5cd922
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
2 changed files with 73 additions and 67 deletions

34
Main.cs
View File

@ -1,7 +1,6 @@
using System.Collections;
using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;
using ConverterExample;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.JsonConverter;
@ -25,15 +24,15 @@ table.Rows.Add(2, "Jane", 25);
table.Rows.Add(3, "Bob", 40);
ds.Tables.Add(table);
JsonSerializerOptions options = new()
System.Text.Json.JsonSerializerOptions options = new()
{
WriteIndented = true,
ReferenceHandler = ReferenceHandler.IgnoreCycles,
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter() }
ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles,
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(), new PersonConverter(), new AddressConverter() }
};
Room r = Factory.GetRoom(1294367, "w5rtvh8".ToUpper(), DateTime.Now, Factory.GetUser(), Milimoe.FunGame.Core.Library.Constant.RoomType.Mix, Milimoe.FunGame.Core.Library.Constant.RoomState.Created);
User u = Factory.GetUser(1, "LUOLI", "123123", DateTime.Now, DateTime.Now, "LUOLI@66.COM", "QWQAQW");
User u = Factory.GetUser(1, "LUOLI", DateTime.Now, DateTime.Now, "LUOLI@66.COM", "QWQAQW");
Hashtable hashtable = new()
{
@ -42,11 +41,28 @@ Hashtable hashtable = new()
{ "user", u }
};
string json = JsonSerializer.Serialize(hashtable, options);
string json = NetworkUtility.JsonSerialize(hashtable, options);
Hashtable hashtable2 = JsonSerializer.Deserialize<Hashtable>(json, options) ?? new();
Hashtable hashtable2 = NetworkUtility.JsonDeserialize<Hashtable>(json, options) ?? new();
User u2 = NetworkUtility.JsonDeserializeFromHashtable<User>(hashtable2, "user") ?? Factory.GetUser();
Room r2 = NetworkUtility.JsonDeserializeFromHashtable<Room>(hashtable2, "room") ?? Factory.GetRoom();
System.Console.WriteLine(u2.Username + " 进入了 " + r2.Roomid + " 房间");
Console.WriteLine(u2.Username + " 进入了 " + r2.Roomid + " 房间");
Person p = new()
{
Age = (int)r2.Id,
Name = u2.Username,
Address = new()
{
State = "呵呵州(Hehe State)",
City = "哈哈市(Haha City)"
}
};
json = NetworkUtility.JsonSerialize(p, options);
Person p2 = NetworkUtility.JsonDeserialize<Person>(json, options) ?? new();
Console.WriteLine("My name is " + p2.Name + ", I am " + p2.Age + "-year-old. I live at " + p2.Address.State + " " + p2.Address.City);

View File

@ -1,77 +1,69 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Library.Common.Architecture;
namespace ConsoleApp1
namespace ConverterExample
{
class Program
{
static void Main(string[] args)
{
string jsonString = @"{""name"": ""John"", ""age"": 30, ""address"": {""city"": ""New York"", ""state"": ""NY""}}";
var options = new JsonSerializerOptions();
options.Converters.Add(new PersonConverter());
var person = JsonSerializer.Deserialize<Person>(jsonString, options);
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.Address.City);
Console.WriteLine(person.Address.State);
}
}
public class Person
{
public string Name { get; set; }
public string Name { get; set; } = "";
public int Age { get; set; }
public Address Address { get; set; }
public Address Address { get; set; } = new();
}
public class Address
{
public string City { get; set; }
public string State { get; set; }
public string State { get; set; } = "";
public string City { get; set; } = "";
}
public class PersonConverter : JsonConverter<Person>
public class AddressConverter : BaseEntityConverter<Address>
{
public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Address? result)
{
string name = null;
int age = 0;
Address address = null;
while (reader.Read())
result ??= new();
switch (propertyName)
{
if (reader.TokenType == JsonTokenType.EndObject)
{
case "city":
result.City = reader.GetString() ?? "";
break;
}
if (reader.TokenType == JsonTokenType.PropertyName)
{
string propertyName = reader.GetString();
switch (propertyName)
{
case "name":
name = reader.GetString();
break;
case "age":
age = reader.GetInt32();
break;
case "address":
address = JsonSerializer.Deserialize<Address>(ref reader, options);
break;
}
}
case "state":
result.State = reader.GetString() ?? "";
break;
}
}
return new Person { Name = name, Age = age, Address = address };
public override void Write(Utf8JsonWriter writer, Address value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteString("state", value.State);
writer.WriteString("city", value.City);
writer.WriteEndObject();
}
}
public class PersonConverter : BaseEntityConverter<Person>
{
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Person? result)
{
result ??= new();
switch (propertyName)
{
case "name":
result.Name = reader.GetString() ?? "";
break;
case "age":
result.Age = reader.GetInt32();
break;
case "address":
result.Address = NetworkUtility.JsonDeserialize<Address>(reader.GetString() ?? "", options) ?? new Address();
break;
}
}
public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions options)
@ -80,9 +72,7 @@ namespace ConsoleApp1
writer.WriteString("name", value.Name);
writer.WriteNumber("age", value.Age);
writer.WritePropertyName("address");
JsonSerializer.Serialize(writer, value.Address, options);
writer.WriteString("address", NetworkUtility.JsonSerialize(value.Address, options));
writer.WriteEndObject();
}