【发布时间】:2022-01-07 06:11:46
【问题描述】:
我想将派生对象列表序列化为 json 并反序列化。序列化工作正常,反序列化无法将对象转换为派生类对象,所有对象都被反序列化为基类对象并丢失属于派生类的成员。 我有基类 AutoEvent,派生类 MouseClickEvent 和 ClickImageEvent,所以一次 我反序列化以列出所有对象都是 AutoEvent 类型。如何反序列化,以便将每个对象转换为派生类对象?
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Web.Script.Serialization;
namespace AutoEvent
{
public class AutoEvent
{
public string Name { get; set; }
public int DelayMs { get; set; }
public AutoEvent(string name, int delayMs)
{
Name = name;
DelayMs = delayMs;
}
public AutoEvent() { }
}
public class MouseClickEvent : AutoEvent
{
public Rectangle RectArea { get; set; }
public bool IsDoubleClick { get; set; }
public MouseClickEvent(string name, int delayMs, Rectangle rectArea, bool isDoubleClick) : base(name, delayMs)
{
RectArea = rectArea;
IsDoubleClick = isDoubleClick;
}
public MouseClickEvent() { }
}
public class ClickImageEvent : AutoEvent
{
public List<string> ImgFiles { get; set; }
public Rectangle SearchArea { get; set; }
public double ImgTolerance { get; set; }
public double ImgError { get; set; }
public bool IsDoubleClick { get; set; }
public ClickImageEvent(string name, int delayMs, Rectangle searchArea, bool isDoubleClick, double imgTol, double imgErr) : base(name, delayMs)
{
SearchArea = searchArea;
IsDoubleClick = isDoubleClick;
ImgTolerance = imgTol;
ImgError = imgErr;
}
public ClickImageEvent() { }
}
class Program
{
static void Main(string[] args)
{
string path = @"c:/nenad/testSer.txt";
List<AutoEvent> events = new List<AutoEvent>();
MouseClickEvent clickEvent1 = new MouseClickEvent("mouse click1", 100, new Rectangle(20, 30, 15, 10), true);
MouseClickEvent clickEvent2 = new MouseClickEvent("mouse click2", 15, new Rectangle(20, 45, 15, 10), true);
ClickImageEvent imgclick1 = new ClickImageEvent("image click1", 15, new Rectangle(20, 45, 555, 150), false, 0.1, 0.05);
ClickImageEvent imgclick2 = new ClickImageEvent("image click2", 125, new Rectangle(2220, 45, 5525, 150), false, 0.15, 0.25);
events.Add(clickEvent1);
events.Add(clickEvent2);
events.Add(imgclick1);
events.Add(imgclick2);
JavaScriptSerializer ser = new JavaScriptSerializer();
string json = ser.Serialize(events);
if (!File.Exists(path))
{
using (var h = File.Create(path)) ;
}
File.WriteAllText(path, json);
json = File.ReadAllText(path);
events = ser.Deserialize<List<AutoEvent>>(json);
MouseClickEvent event1 = (MouseClickEvent)events[0]; // fails at runtime to convert
ClickImageEvent event2 = (ClickImageEvent)events[2]; // fails at runtime to convert
}
}
}
【问题讨论】:
-
这不起作用,因为 events[0] 是 AutoEvent 类型,所以它不包含像 RectArea 和 IsDoubleClick 这样的成员,而只有 Name 和 DelayMs。
标签: c# inheritance serialization