2

我的项目通过 UDP 获得了很多 JSON 字符串,每个字符串都描述了一些对象列表。我无法编写一个获取某个列表的函数,并对这个列表进行反序列化。问题是我不能在不知道构成列表的对象的类名的情况下进行 Deerialization。我试图给每个部门ID字段..但是在这里,我也无法对特定字段进行Derialization,因为部门名称不知道。

有没有人有办法解决吗?

4

2 回答 2

2

使您的所有实体都从基类实现:

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
{
   ...
}
于 2013-07-19T11:17:12.597 回答
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.

仅当您可以在发送端进行包装时,上述过程才有效。否则,你就完蛋了:-)

于 2013-07-19T11:18:38.357 回答