如何克隆一个不可序列化的对象? (C#)
How to clone an unserializable object? (C#)
我正在为 Windows 版本 2 使用 Kinect,但遇到了问题。我尝试序列化 Body 对象并通过 Internet 发送它。但是 Body 对象是不可消毒的。虽然我可以从 Body 对象中提取一些关键信息并创建我自己的对象,但我可能会丢失一些信息。我的问题是如何将 Body 对象中的所有信息克隆到我自己的可序列化对象中?
谢谢。
没关系。只需执行以下逻辑:
- 使用反射循环遍历要克隆的对象的属性。
- 您可以使用预定义的自定义设置数据 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
计算出它可以映射 MyUser
和 User
class 的 Id
属性 因为它们的名称相同,但是我们需要创建自定义映射以将 User.FirstName
和 User.LastName
映射到 MyUser.Name
属性.
我正在为 Windows 版本 2 使用 Kinect,但遇到了问题。我尝试序列化 Body 对象并通过 Internet 发送它。但是 Body 对象是不可消毒的。虽然我可以从 Body 对象中提取一些关键信息并创建我自己的对象,但我可能会丢失一些信息。我的问题是如何将 Body 对象中的所有信息克隆到我自己的可序列化对象中? 谢谢。
没关系。只需执行以下逻辑:
- 使用反射循环遍历要克隆的对象的属性。
- 您可以使用预定义的自定义设置数据 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
计算出它可以映射 MyUser
和 User
class 的 Id
属性 因为它们的名称相同,但是我们需要创建自定义映射以将 User.FirstName
和 User.LastName
映射到 MyUser.Name
属性.