짧은 대답 : 예.
긴 답변 : 팩토리 메서드 패턴이 원하는 것입니다.
네트워크 메시지는 메시지 머리글에 역 직렬화 할 개체의 유형과 크기를 포함해야하며받는 사람 측에서는 나머지 메시지 본문을 소비하고 deserialize하여 개체를 구성 할 수 있습니다.
이 간단한 작업은 모든 클래스가 serialize하고 개인 구조체에서 전선을 통해 보낼 데이터를 저장하도록하는 것이 좋습니다. 다른 직렬화되지 않은 클래스 데이터는이 구조체 외부에 있습니다. 그렇게하면 최소한의 작업으로 전체 구조체를 네트워크에 덤프 할 수 있습니다. 분명히 크로스 플랫폼 (예 : 크거나 작은 또는 큰 엔디안)으로 이동하는 경우 바이트 순서 고려 사항을 고려해야 할 수 있습니다. 이 같은
뭔가 (I이 난 그냥 내 머리 위로 떨어져 그것을 쓰고 있어요 완벽과는 거리가 먼 확신) :
enum VehicleType
{
VehicleType_Car,
VehicleType_Bike
};
class Vehicle
{
virtual size_t GetDataSize() = 0;
virtual void* GetData() = 0;
};
class Bike : Vehicle
{
private:
VehicleType _type;
size_t _dataSize;
struct BikeData
{
char[100] name;
// etc
} _data;
public:
Bike(void* data)
: Bike(static_cast<BikeData*>(data)->name)
{
}
Bike(char[]& name)
: _type(VehicleType_Bike), _dataSize(sizeof(BikeData))
{
memset(&_data.name, 0, 99);
strncpy(&_data.name, name, 99);
}
virtual size_t GetDataSize() { return _dataSize; }
virtual void* GetData() { return &_data; }
};
class Car : Vehicle
{
// etc
};
void SendVehicle(int socket, const Vehicle& vehicle)
{
write(socket, vehicle.GetData(), vehicle.GetDataSize());
}
Vehicle* ReceiveVehicle(int socket)
{
VehicleType type;
size_t dataSize;
read(socket, &type, sizeof(VehicleType));
read(socket, &dataSize, sizeof(size_t));
BYTE* data = new BYTE[dataSize];
read(socket, &data, dataSize);
Vehicle v* = CreateVehicle(type, dataSize, data);
delete[] data;
return v;
}
// The factory method.
Vehicle* CreateVehicle(VehicleType type, size_t dataSize, void* data)
{
switch(type)
{
case VehicleType_Car: return new Car(data);
case VehicleType_Bike: return new Bike(data);
}
return 0;
}
당신도 버퍼를 사용하여 일부 메모리 단편화를 피할 수 소켓을 자전거의 _ 데이터 구조로 읽습니다.
항상 그렇듯이 사용중인 패턴을 읽는 것이 좋습니다. 여기에 Factory Method Pattern에 관한 위키 백과 문서가 있습니다.
Boost Serialization 라이브러리도 확인해야합니다. 이는 엔디안과 워드 크기가 다른 시스템에서 데이터를 직렬화하는 데 도움이됩니다. 위에서 설명한 방법은 매우 간단하며 그런 식으로 다루지 않습니다.
출처
2010-04-27 15:46:15
orj
당신이 묻고/생각하고있는 것이 확실하지 않습니다. 바이트 배열은 객체의 가변 부분과 가능하면 해당 하위 유형을 나타내는 "페이로드"의 일종입니까? 디 직렬화? 개체가 양쪽에서 사용되며 동기화가 필요합니까? 첫 번째 경우에 어떤 하위 클래스를 인스턴스화 할 것인지 결정하는 요인은 무엇입니까? –
C++ CORBA 구현에서 사용하는 표준 직렬 처리기를 사용하지 않는 이유는 무엇입니까? –
바이트 배열이 직렬화 목적으로 사용됩니다. 동기화, 한 쪽 보내기 및 다른 쪽 사용은 필요 없습니다. 바이트 배열의 하위 문자열을 사용하여 하위 클래스로 결정합니다. – metdos