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

时间:2015-04-25 04:26:08

标签: c# kinect

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

3 个答案:

答案 0 :(得分:0)

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

  1. 使用反射循环遍历要克隆的对象的属性。
  2. 您可以使用预定义的自定义类设置数据。 (也许您可能希望根据对象的属性生成XML模式,然后从那里创建自己的预定义自定义类。)
  3. 希望这个概念有所帮助。如果没有,让我们进一步讨论。

答案 1 :(得分:0)

如果序列化的目的是在另一端重构它,那么首先需要确定构造函数和setter是否存在,以便在另一端创建等效函数。如果它纯粹是为了服务器端需要与之交互的独立表示,那么您的任务就更简单了。

我的建议是通过文档和调试器中的反射通过公共接口检查body对象,以确定您可以想要提取哪些数据,并根据该层次模型构建自定义的可序列化类。 / p>

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

答案 2 :(得分:0)

如果您正在关注克隆,请使用public void write2(Iterable<?> objects) { try (BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("out.txt"), "UTF-8"))) { objects.forEach(wrap(o -> bw.write(o.toString()))); } catch (IOException|UncheckedIOException e) { //handle exception } }

首先,您需要使用NuGet ...

安装AutoMapper
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; } } 确定它可以映射AutoMapperId类的MyUser属性,因为它们的名称相同,但我们需要创建自定义地图以将UserUser.FirstName映射到User.LastName属性。