为什么进程内存查看器将字节数组读取为字符串?
Why are process memory viewers reading byte arrays to strings?
我有 2 个 c# 应用程序,它们通过 netPipe WCF 相互通信。一个应用程序正在向另一个应用程序发送一个字节数组。如果我使用进程内存查看器(如 CheatEngine)检查接收应用程序的内存映射,我可以将接收到的字节数组作为字符串读取。为什么会这样?
答案很简单,数组自然是引用类型,为什么呢?因为它在内存中不能只有一个值,而它指向许多不同的内存位置,每个位置都有特定的值。这就是为什么它应该是一个引用类型。因此,对象(数组)不能直接从一台计算机传递到另一台计算机。然后会发生什么?与对象关联的所有值都必须从内存中获取,并且它们必须是 "Serialized" 以便在接收方接收时可以将其转换为原始形式。这称为反序列化。有许多不同的序列化和反序列化数据的方法,例如将对象转换为 XML 或 JSON,或者进行与您正在做的非常相似的二进制序列化,我的意思是传递字节数组。
为了更详细地想象下面的模型:
public class MyModel{
public string Name{get; set;}
public string Email{get; set;}
}
如果您想交流:
MyModel Model = new MyModel{ Name ="Jack", Email = "Gmail"};
此对象将被翻译成如下内容:
<MyModel>
<Name>Jack</Name>
<Email>Gmail</Email>
</MyModel>
这样它就可以通过,当它被接收时,它会被施放回原来的形式。但是 MyModel
class mist 在双方都可用,所以我的建议是将这些类型保留在 dll 文件中以允许重用。
你想知道更多,让我知道添加更多细节。
我有 2 个 c# 应用程序,它们通过 netPipe WCF 相互通信。一个应用程序正在向另一个应用程序发送一个字节数组。如果我使用进程内存查看器(如 CheatEngine)检查接收应用程序的内存映射,我可以将接收到的字节数组作为字符串读取。为什么会这样?
答案很简单,数组自然是引用类型,为什么呢?因为它在内存中不能只有一个值,而它指向许多不同的内存位置,每个位置都有特定的值。这就是为什么它应该是一个引用类型。因此,对象(数组)不能直接从一台计算机传递到另一台计算机。然后会发生什么?与对象关联的所有值都必须从内存中获取,并且它们必须是 "Serialized" 以便在接收方接收时可以将其转换为原始形式。这称为反序列化。有许多不同的序列化和反序列化数据的方法,例如将对象转换为 XML 或 JSON,或者进行与您正在做的非常相似的二进制序列化,我的意思是传递字节数组。
为了更详细地想象下面的模型:
public class MyModel{
public string Name{get; set;}
public string Email{get; set;}
}
如果您想交流:
MyModel Model = new MyModel{ Name ="Jack", Email = "Gmail"};
此对象将被翻译成如下内容:
<MyModel>
<Name>Jack</Name>
<Email>Gmail</Email>
</MyModel>
这样它就可以通过,当它被接收时,它会被施放回原来的形式。但是 MyModel
class mist 在双方都可用,所以我的建议是将这些类型保留在 dll 文件中以允许重用。
你想知道更多,让我知道添加更多细节。