我的项目通过UDP获取大量JSON字符串,每个字符串描述一些对象列表。 我不能编写一个获得一些列表的函数,并将Derialization设置为此列表。 问题是,如果不知道构成列表的对象的类名,我就无法进行Derialization。 我试图给每个部门ID字段..但是在这里,我也不能为特定字段做Derialization,因为部门名称不知道。
有没有人有解决方案?
答案 0 :(得分:2)
让所有实体从Base类实现:
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
如果您需要从任何其他第三方库类实现您的DTO,请执行以下操作:
public abstract class BaseEntity : AnyOther3rdPartyLibraryClass
{
public EntityTypeEnum EntityType {get;set;}
}
public class EntityFive : BaseEntity
{
...
}
答案 1 :(得分:2)
是的,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
。
只有在发送方进行包装时,上述步骤才有效。否则,你被搞砸了: - )