如何克隆一个不可序列化的对象? (C#)

How to clone an unserializable object? (C#)

我正在为 Windows 版本 2 使用 Kinect,但遇到了问题。我尝试序列化 Body 对象并通过 Internet 发送它。但是 Body 对象是不可消毒的。虽然我可以从 Body 对象中提取一些关键信息并创建我自己的对象,但我可能会丢失一些信息。我的问题是如何将 Body 对象中的所有信息克隆到我自己的可序列化对象中? 谢谢。

没关系。只需执行以下逻辑:

  1. 使用反射循环遍历要克隆的对象的属性。
  2. 您可以使用预定义的自定义设置数据 class。 (也许您可能想根据对象的属性生成 XML 架构,然后从那里创建您自己的预定义自定义 class)。

希望这个概念对您有所帮助。如果没有,我们再讨论。

如果序列化的目的是在另一端重构它,首先你需要确定constructor和setters是否存在,以便你在另一端创建一个等价物。如果纯粹是为了你的服务器端需要与之交互的独立表示,你的任务就简单多了。

我的建议是通过文档提供的 public 接口和调试器中的反射来检查 body 对象,以确定您可以和想要提取哪些数据并构建自定义的可序列化 class 基于该分层模型。

如果您需要提取的所有数据都可以 public 访问,只需编写一个构建器 class 将正文对象作为其输入并将您的自定义 class 构造为输出。如果它 public 不可访问,您可能需要使用反射来探索您需要的部分。我建议手动构建反射代码,以避免对象图中可能存在于私有 class 中的循环。

如果您关心的是克隆,请使用 AutoMapper

首先,您需要使用 NuGet 安装 AutoMapper...

PM> Install-Package AutoMapper

然后查看此示例并根据您自己的需要进行调整...

void Main()
{
    AutoMapper.Mapper.CreateMap<User, MyUser>()
        .ForMember(myUsers => myUsers.Name, users => users.MapFrom(property => string.Format("{0} {1}",property.FirstName, property.LastName)));

    User user = new User
    {
        FirstName = "James",
        LastName = "Doe",
        DateOfBirth = DateTime.UtcNow
    };


    MyUser myUser = AutoMapper.Mapper.Map<MyUser>(user);
}

public class MyUser
{
    public string Id { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }

}

public class User 
{
    public User()
    {
        this.Id = Guid.NewGuid().ToString();
    }
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

在上面的示例中,AutoMapper 计算出它可以映射 MyUserUser class 的 Id 属性 因为它们的名称相同,但是我们需要创建自定义映射以将 User.FirstNameUser.LastName 映射到 MyUser.Name 属性.