我的项目通过 UDP 获得了很多 JSON 字符串,每个字符串都描述了一些对象列表。我无法编写一个获取某个列表的函数,并对这个列表进行反序列化。问题是我不能在不知道构成列表的对象的类名的情况下进行 Deerialization。我试图给每个部门ID字段..但是在这里,我也无法对特定字段进行Derialization,因为部门名称不知道。
有没有人有办法解决吗?
我的项目通过 UDP 获得了很多 JSON 字符串,每个字符串都描述了一些对象列表。我无法编写一个获取某个列表的函数,并对这个列表进行反序列化。问题是我不能在不知道构成列表的对象的类名的情况下进行 Deerialization。我试图给每个部门ID字段..但是在这里,我也无法对特定字段进行Derialization,因为部门名称不知道。
有没有人有办法解决吗?
使您的所有实体都从基类实现:
public abstract class BaseEntity
{
public EntityTypeEnum EntityType {get;set;}
}
public enum EntityTypeEnum
{
EntityOne,
EntityTwo,
EntityThree
}
现在您可以在开始时将您的实体从 JSON 反序列化为 BaseEntity,查看您得到的实体类型,然后反序列化为您获得的类型。
JsonSerializer js = new JsonSerializer();
var baseEntity = js.Deserialize<BaseEntity>()
switch(baseEntity.EntityType)
{
case EntityOne:
var result= js.Deserialize<EntityOne>();
//DoSomeThing
break;
case EntityTwo:
var result= js.Deserialize<EntityTwo>();
//DoSomeThing
break;
}
编辑Zoka
如果你想通过你的实体实现其他任何东西,你可以这样做:
public class AnythingElse : BaseEntity
{
//...
}
public class EntityFour : AnythingElse
{
//....
}
Zoka的编辑№2
如果您需要从任何其他 3rd 方库类实现您的 DTO,只需执行以下操作:
public abstract class BaseEntity : AnyOther3rdPartyLibraryClass
{
public EntityTypeEnum EntityType {get;set;}
}
public class EntityFive : BaseEntity
{
...
}
是的,JSON 问题。我会走封装的方式。首先,我将创建包装器:
public class JSONObjectWrapper
{
public string ObjectType;
public string ObjectInJSON;
[DoNotSerialize] // sorry do not remember the attribute to exclude it from serialization
public object ObjectData;
}
在序列化期间,您将显式序列ObjectData
化为ObjectInJSON
. 然后发送序列化的 JSONOBjectWrapper。
在传入端,您总是知道它是 JSONObjectWrapper。反序列化它 - 通过这个你可以获得带有对象和对象类型的 JSON。找到这个对象类型,使用一些工厂创建它,然后将它反序列OBjectInJSON
化为ObjectData
.
仅当您可以在发送端进行包装时,上述过程才有效。否则,你就完蛋了:-)