【问题标题】:Cast a type to the same type but in different assembly?将类型转换为相同类型但在不同的程序集中?
【发布时间】:2015-02-11 05:42:55
【问题描述】:

我序列化了一个类并使用IPC 将其发送到另一个应用程序,但是当我尝试将接收到的类转换为同一类(但在不同的程序集中)时,如果(在安全转换的情况下)或如果直接强制转换,则抛出异常..

那么我如何访问接收到的类 throw IPC 的数据成员?请注意,我使用 JSON 序列化和反序列化将我的课程发送到其他应用程序。

我尝试将两个应用程序设置为相同的程序集名称,但这不起作用。

我还尝试使用相同的结果设置程序集 GUID。

【问题讨论】:

  • 检查this 并应用反向逻辑将其从字节转换回对象。
  • @YoryeNathan 它不是字节,它是 Json 对象,因为我说过我使用 JSON.net 来序列化和反序列化对象
  • 如果你在不同的程序集中有相同的类名,那么即使同名,它们也是两种不同的类型。在序列化和反序列化端进行通用程序集和使用。
  • 因为二进制文件需要对现有代码进行大量编辑,JSON.NET 似乎工作得很好,但它不会将接收到的对象转换为目标程序集中的等价物
  • 一切都是由字节组成的。如果您已经有不同的序列化/反序列化方法(例如 JSON),那同样好。包含您的代码以显示实际问题所在。

标签: c#


【解决方案1】:

如果您在不同的程序集中具有相同的类名,那么即使它们具有相同的名称,它们也是两种不同的类型。在序列化和反序列化端进行通用程序集和使用。

如果您不想使用推荐的通用程序集,您可以获取序列化的 json 字符串并从该字符串中获取属性和值,并使用它们来创建您想要的对象。

我使用JSON.NET 将 json 字符串转换为字典以访问具有值的属性。你可以更多方式here

Dictionary<string, string> dic = JsonConvert.DeserializeObject < Dictionary<string, string>>(jsonSerializedString);
MyObject myObject = new MyObject { Name = dic["Name"], Id = int.Parse(dic["Id"]) };

我使用了 MyObject,它会被你的类型替换

public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}

【讨论】:

    【解决方案2】:

    不要将different assemblydifferent namespace 混淆。

    如果这确实是 same 类,您应该将它放在双方都可见/可访问的命名空间中。尝试将您的课程放在双方都引用的公共程序集中。

    如果您无法更改程序集结构,请定义一个双方都可以引用的接口(在附加程序集中)。在接收端,您可以声明一个实现此接口的新类。

    【讨论】:

    • 所以我无法即时转换它,因为这样做需要我更改很多核心代码。
    • 我不明白您的第一句话“不要将不同的程序集与不同的命名空间混淆”。适用于此。 OP 没有提及命名空间。
    • @Enigmativity 他懂我
    • @DanielEugen 除了类型转换,您还可以创建要对其进行类型转换的类的对象。
    • @Adil 你是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多