Serialization 序列化和封送处理之间有什么区别?

Serialization 序列化和封送处理之间有什么区别?,serialization,terminology,marshalling,rpc,Serialization,Terminology,Marshalling,Rpc,我知道在一些分布式技术(如RPC)中使用了术语“封送”,但不理解它与序列化的区别。它们不是都在将对象转换为一系列位吗 相关的: 我认为主要的区别在于编组应该也涉及到代码库。换句话说,您将无法将对象封送和解封送到另一个类的状态等效实例中 序列化只是意味着您可以存储对象并重新获得等效状态,即使它是另一个类的实例 也就是说,它们通常是同义词。摘自维基百科文章: 术语“封送”在Python标准库中被视为与“序列化”同义,但在与Java相关的RFC 2713中,这些术语并不同义: “封送”对象意味着记录

我知道在一些分布式技术(如RPC)中使用了术语“封送”,但不理解它与序列化的区别。它们不是都在将对象转换为一系列位吗

相关的:


我认为主要的区别在于编组应该也涉及到代码库。换句话说,您将无法将对象封送和解封送到另一个类的状态等效实例中

序列化只是意味着您可以存储对象并重新获得等效状态,即使它是另一个类的实例

也就是说,它们通常是同义词。

摘自维基百科文章:

术语“封送”在Python标准库中被视为与“序列化”同义,但在与Java相关的RFC 2713中,这些术语并不同义:

“封送”对象意味着记录其状态和代码库,当封送的对象被“取消封送”时,可能通过自动加载对象的类定义来获得原始对象的副本。您可以封送任何可序列化或远程的对象。编组与序列化类似,只是编组还记录代码基。编组与序列化的不同之处在于编组专门处理远程对象。(RFC 2713)

“序列化”对象意味着将其状态转换为字节流,以便字节流可以转换回对象的副本


因此,编组除了保存对象的状态外,还将对象的代码库保存在字节流中。

编组通常在关联相对紧密的进程之间进行;序列化不一定有这种期望。因此,当在进程之间封送数据时,例如,您可能只希望发送对潜在昂贵数据的引用以进行恢复,而对于序列化,您希望保存所有数据,以便在反序列化时正确地重新创建对象。

封送和序列化在远程过程调用上下文中大致同义,但是语义上是不同的

特别是,封送处理是指从这里到那里获取参数,而序列化是指将结构化数据复制到基元形式(如字节流)或从基元形式复制。从这个意义上讲,序列化是执行封送处理的一种方法,通常实现按值传递语义

也可以通过引用封送对象,在这种情况下,“在线”上的数据只是原始对象的位置信息。但是,这样的对象仍然可以进行值序列化


正如@Bill所提到的,可能还有其他元数据,比如代码库位置,甚至对象实现代码。

将它们视为同义词,两者都有一个生产者将内容发送给消费者。。。在末尾,实例的字段被写入字节流,而另一端则反过来写入相同的实例


注意-java RMI还支持传输收件人缺少的类。

封送是指将函数的签名和参数转换为单字节数组。 专门用于RPC的目的

序列化通常指将整个对象/对象树转换为字节数组 封送处理将序列化对象参数,以便将它们添加到消息中并通过网络传递。
*序列化还可用于磁盘存储。*

两者都有一个共同点,那就是序列化对象。序列化用于传输对象或存储对象。但是:

  • 序列化:序列化对象时,仅将该对象中的成员数据写入字节流;不是那个代码 实际上实现了对象
  • 编组:术语编组在我们谈论将对象传递给远程对象(RMI)时使用。在编组中,序列化对象(序列化成员数据)+附加代码库
因此序列化是编组的一部分。


代码库是告诉对象接收者在哪里可以找到该对象的实现的信息。任何认为自己可能会将某个对象传递给另一个以前可能没有见过它的程序的程序都必须设置代码库,这样,如果在本地没有可用的代码,接收者就可以知道从哪里下载代码。在对对象进行反序列化后,接收方将从对象中提取代码库并从该位置加载代码。

我对编组的理解与其他答案不同

序列化:

使用约定生成或重新水化对象图形的有线格式版本

编组:

使用映射文件生成或重新水化对象图形的有线格式版本,以便可以自定义结果。该工具可以从遵守约定开始,但重要的区别在于定制结果的能力

合同优先开发:

编组在合同优先开发环境中非常重要

  • 可以对内部对象图进行更改,同时随时间保持外部接口的稳定。这样,所有的服务订户就不必为每一个微小的更改而修改
  • 可以跨不同语言映射结果。例如,从一种语言的属性名称约定(“属性名称”)到另一种语言的属性名称约定(“属性名称”)
编组是告诉编译器如何在另一个环境/系统上表示数据的规则; 比如,

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
你可以看到两个不同的
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct {
    char value[11];
} SerializedInt32;

SerializedInt32 SerializeInt32(int32_t x) 
{
    SerializedInt32 result;

    itoa(x, result.value, 10);

    return result;
}

int32_t DeserializeInt32(SerializedInt32 x) 
{
    int32_t result;

    result = atoi(x.value);

    return result;
}

int main(int argc, char **argv)
{    
    int x;   
    SerializedInt32 data;
    int32_t result;

    x = -268435455;

    data = SerializeInt32(x);
    result = DeserializeInt32(data);

    printf("x = %s.\n", data.value);

    return result;
}
#include <iostream>
#include <string>

extern "C"
__declspec(dllexport)
void *StdCoutStdString(void *s)
{
    std::string *str = (std::string *)s;
    std::cout << *str;
}

extern "C"
__declspec(dllexport)
void *MarshalCStringToStdString(char *s)
{
    std::string *str(new std::string(s));

    std::cout << "string was successfully constructed.\n";

    return str;
}

extern "C"
__declspec(dllexport)
void DestroyStdString(void *s)
{
    std::string *str((std::string *)s);
    delete str;

    std::cout << "string was successfully destroyed.\n";
}
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(int argc, char **argv)
{
    void *myStdString;

    LoadLibrary("MarshalDemoLib");

    myStdString = ((void *(*)(char *))GetProcAddress (
        GetModuleHandleA("MarshalDemoLib"),
        "MarshalCStringToStdString"
    ))("Hello, World!\n");

    ((void (*)(void *))GetProcAddress (
        GetModuleHandleA("MarshalDemoLib"),
        "StdCoutStdString"
    ))(myStdString);

    ((void (*)(void *))GetProcAddress (
        GetModuleHandleA("MarshalDemoLib"),
        "DestroyStdString"
    ))(myStdString);    
}
#include <stdio.h>

typedef struct {
    int fst;
    int snd;
} pair1;

typedef struct {
    int snd;
    int fst;
} pair2;

void pair2_dump(pair2 p)
{
    printf("%d %d\n", p.fst, p.snd);
}

pair2 marshal_pair1_to_pair2(pair1 p)
{
    pair2 result;
    result.fst = p.fst;
    result.snd = p.snd;
    return result;
}

pair1 given = {3, 7};

int main(int argc, char **argv)
{    
    pair2_dump(marshal_pair1_to_pair2(given));

    return 0;
}
var x = new ActiveXObject("Dmitry.YetAnotherTestObject.YetAnotherTestObject");

x.send([1, 2, 3, 4]);
using System;
using System.Runtime.InteropServices;

namespace Dmitry.YetAnotherTestObject
{
    [Guid("C612BD9B-74E0-4176-AAB8-C53EB24C2B29"), ComVisible(true)]
    public class YetAnotherTestObject
    {
        public void send(object x)
        {
            System.Console.WriteLine(x.GetType().Name);
        }
    }
}
JVM -> Class Loader -> load class definition
java -Djava.rmi.server.codebase="<some_URL>" -jar <some.jar>
Serialisation - state
Marshalling - state + class definition