[英]Member class not serializing the defined way
如何確保另一個類中的自定義類按照定義進行序列化?
我有一堂課:
public class Event
{
public string Type { get; set; }
public DateTime Timestamp { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this, Utils.IsoDateTimeConverter());
}
}
IsoDateTimeConverter()
定義如下:
public static class Utils
{
private static IsoDateTimeConverter isoDateTimeConverter = null;
public static IsoDateTimeConverter IsoDateTimeConverter()
{
if (isoDateTimeConverter == null)
{
isoDateTimeConverter = new IsoDateTimeConverter
{
DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";
};
}
return isoDateTimeConverter;
}
}
如果我在 Event 對象上調用.ToString()
,則該項目將正確序列化( TimeStamp的格式正確,即我定義的格式):
var testEvent = new Event() { Type = "Test", Timestamp = new DateTime(2021, 7, 12, 11, 6, 36, 0) };
var result = testEvent.ToString();
結果
{
"Type":"Test",
"Timestamp":"2021-07-12T11:06:36.0000000Z"
}
如果我在 Event 周圍創建一個包裝類 UserEvent,並嘗試對其進行序列化,則 Event 類的序列化方式不同:
public class UserEvent
{
public string UserId { get; set; }
public Event Event { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
// Example of usage:
var testEvent = new Event() { Type = "Test", Timestamp = new DateTime(2021, 7, 12, 11, 6, 36, 0);
var testUserEvent = new UserEvent(){UserId = "TestId", Event = testEvent};
var result = testUserEvent.ToString();
結果
{
"UserId":"TestUserId",
"Event":{
"Type":"Test",
"Timestamp":"2021-07-12T11:06:36"
}
}
請注意,時間戳的格式與以前不同。
如何確保當 Event 在另一個類中時它被正確序列化?
編輯 1 :我知道如果我將 UserEvent 序列化為JsonConvert.SerializeObject(this, Utils.IsoDateTimeConverter())
輸出將如預期JsonConvert.SerializeObject(this, Utils.IsoDateTimeConverter())
但我不想這樣做,因為我不想讓包裝類知道內部類的外觀以及它應該如何序列化。 內部類應該按照它在內部定義的方式進行序列化。
我建議創建一個自定義IsoDateTimeConverter
類,您可以在其中覆蓋DateTimeFormat
:
public class CustomIsoDateTimeConverter: IsoDateTimeConverter
{
public CustomIsoDateTimeConverter()
{
DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";
}
}
您可以在沒有工廠方法的情況下使用此類(如IsoDateTimeConverter()
)
您可以使用JsonConverterAttribute來裝飾您的Timestamp
屬性:
public class Event
{
public string Type { get; set; }
[JsonConverter(typeof(CustomIsoDateTimeConverter))]
public DateTime Timestamp { get; set; }
}
我建議從兩個類中刪除ToString
覆蓋。 您可能需要以不同的格式序列化相同的數據,然后您會遇到麻煩。
var testEvent = new Event() { Type = "Test", Timestamp = new DateTime(2021, 7, 12, 11, 6, 36, 0) };
var testUserEvent = new UserEvent(){UserId = "TestId", Event = testEvent};
var result = JsonConvert.SerializeObject(testUserEvent);
結果
{
"UserId":"TestId",
"Event":{
"Type":"Test",
"Timestamp":"2021-07-12T11:06:36.0000000Z"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.