C ++에서 템플릿 함수 직렬화 및 역 직렬화를 대칭 적으로 구현하는 방법

영혼 기계

개체를 직렬화 및 역 직렬화하는 일련의 템플릿 함수를 작성하고 싶습니다. 직렬화 부분을 완료했으며 모든 것이 작동합니다.

#ifndef SERIALIZE_H
#define SERIALIZE_H

#include <string>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <memory>

inline std::string to_json(int value) {
    return std::to_string(value);
}


inline std::string to_json(long value) {
    return std::to_string(value);
}


inline std::string to_json(double value) {
    return std::to_string(value);
}


inline std::string to_json(const std::string& myStr) {
    return "\"" + myStr + "\"";
}


template <typename T>
std::string to_json(const std::vector<T>& vec) {
    std::string json("[");

    for(auto &i : vec) {
        json += to_json(i);
        json += ",";
    }

    if (!vec.empty()) json.pop_back();
    json += "]";
    return json;
}


template <typename T>
std::string to_json(const std::unordered_set<T>& mySet) {
    std::string json("[");

    for(const auto& i : mySet) {
        json += to_json(i);
        json += ",";
    }

    if (!mySet.empty()) json.pop_back();
    json += "]";
    return json;
}


template <typename K, typename V>
std::string to_json(const std::unordered_map<K, V>& myMap) {
    std::string json("{");

    for(const auto& i : myMap) {
        json += to_json(i.first);
        json += ":";
        json += to_json(i.second);
        json += ",";
    }

    if (!myMap.empty()) json.pop_back();
    json += "}";
    return json;
}

#endif //SERIALIZE_H

이것은 serialize.h모든 종류의 조합을 직렬화 할 수 있습니다 unordered_map<string, vector<int>>.

이제 임의의 조합을 지원하기 위해 역 직렬화 기능을 재귀 적으로 구현하는 방법을 모르겠습니다.

다음은 deserialize.h작동하지 않는 입니다.

#ifndef DESERIALIZE_H
#define DESERIALIZE_H

#include <string>
#include <rapidjson/document.h>


template<typename T>
T from_json(const std::string &json);

template<>
int from_json(const std::string &json) {
    return std::stoi(json);
}

template<>
long from_json(const std::string &json) {
    return std::stol(json);
}

template<>
double from_json(const std::string &json) {
    return std::stod(json);
}

template<>
std::string from_json(const std::string &json) {
    return json.substr(1, json.size()-1);
}

//
template<typename T>
std::vector<T> from_json(const std::string& json) {
    rapidjson::Value jsonValue;
    {
        const std::string &input = "{\"input\":" + json + "}";
        rapidjson::Document document;
        document.Parse(input.c_str());
        jsonValue = document["input"];
    };
    std::vector<T> vec;
    assert(jsonValue.IsArray());

    for (rapidjson::SizeType i = 0; i < jsonValue.Size(); i++) {
        int element = from_json<T>(std::string(jsonValue[i].GetString()));
        vec.push_back(element);
    }
    return vec;
}

#endif //DESERIALIZE_H

rapidjsonC ++ JSON 라이브러리, https://github.com/miloyip/rapidjson

그런 다음 JSON 문자열을 역 직렬화하려고하면 :

#include "deserialize.h>

int main() {
    auto vec1 = from_json<std::vector<int>>(std::string("[1,2,3]"));
    return 0;
}

컴파일 오류가 발생합니다.

error: call of overloaded ‘from_json(std::string)’ is ambiguous

직렬화만큼 쉽게 역 직렬화 기능을 구현할 방법이없는 것 같습니다.

어떤 아이디어?

야론

매번 동일한 인수와 다른 반환 유형을 사용하여 동일한 함수 (from_json (...))를 오버로드하려고합니다. 이것은 합법적이지 않습니다. 오버로딩의 경우 다른 인수 유형 또는 인수 번호가 필요합니다.

Instead of
template<>
double from_json(const std::string &json) {
    return std::stod(json);
}

template<>
std::string from_json(const std::string &json) {
    return json.substr(1, json.size()-1);
}

아마도 이것을 시도하거나 적어도 이것은 일반적인 아이디어 여야합니다.

template<>
void from_json(const std::string &json, double *out_value) {
    *out_value = std::stod(json);
}

template<>
void from_json(const std::string &json, std::string *out_value) {
    out_value = json.substr(1, json.size()-1);
}

오류가 있다고 확신하지만 이렇게하면 작동 할 수 있다고 생각합니다 (수정하면).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

TFS에서 빌드 프로세스 매개 변수를 역 직렬화 및 직렬화하는 방법

분류에서Dev

Unity에서 GameObject 및 Vector2를 포함하는 사전을 직렬화 및 역 직렬화하는 방법

분류에서Dev

C #에서 동적 및 정적 키 이름으로 JSON을 역 직렬화하는 방법

분류에서Dev

REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

분류에서Dev

C #에서 부울 변수에 대한 직렬화 역 직렬화를 수행하는 가장 간단한 방법은 무엇입니까?

분류에서Dev

C #에서 XML을 개체로 역 직렬화하는 방법

분류에서Dev

소켓으로 보낸 해시를 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

분류에서Dev

C #에서 JSON으로 직렬화하고 TS에서 역 직렬화

분류에서Dev

C #을 사용하여 XML 파일에서 데이터를 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

Json .Net은 플랫 객체를 복잡한 객체로 직렬화합니다 (직렬화 / 역 직렬화에 대한 객체 구조 변경).

분류에서Dev

C #에서 List <T> 직렬화 및 js 배열로 역 직렬화

분류에서Dev

파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

RenderedImage를 텍스트 문자열로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

C ++에서 두 폴더의 diff를 최적으로 직렬화하는 방법

분류에서Dev

직렬화 된 List <>를 C #에서 효율적으로 압축하는 방법

분류에서Dev

C #에서 int를 키로 사용하는 JSON 역 직렬화

분류에서Dev

C #에서 JSON 파일 역 직렬화 및 직렬화

분류에서Dev

C #으로 JSON 파일을 역 직렬화하는 방법

분류에서Dev

C #에서 JSON 배열을 역 직렬화하는 방법

분류에서Dev

C #에서 JSON을 역 직렬화하는 방법

분류에서Dev

C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

분류에서Dev

JavaScriptSerializer를 사용하여 JSON을 튜플으로 역 직렬화하는 방법

분류에서Dev

특성없는 C # JSON 직렬화 및 역 직렬화

분류에서Dev

WCF-ISO8583에서 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

현재 상태로 양식 직렬화 및 역 직렬화

분류에서Dev

C #에서 과학적 표기법없이 문자열을 JObject로 역 직렬화하는 방법

분류에서Dev

@@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

Related 관련 기사

  1. 1

    TFS에서 빌드 프로세스 매개 변수를 역 직렬화 및 직렬화하는 방법

  2. 2

    Unity에서 GameObject 및 Vector2를 포함하는 사전을 직렬화 및 역 직렬화하는 방법

  3. 3

    C #에서 동적 및 정적 키 이름으로 JSON을 역 직렬화하는 방법

  4. 4

    REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

  5. 5

    C #에서 부울 변수에 대한 직렬화 역 직렬화를 수행하는 가장 간단한 방법은 무엇입니까?

  6. 6

    C #에서 XML을 개체로 역 직렬화하는 방법

  7. 7

    소켓으로 보낸 해시를 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  8. 8

    C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

  9. 9

    C #에서 JSON으로 직렬화하고 TS에서 역 직렬화

  10. 10

    C #을 사용하여 XML 파일에서 데이터를 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  11. 11

    Json .Net은 플랫 객체를 복잡한 객체로 직렬화합니다 (직렬화 / 역 직렬화에 대한 객체 구조 변경).

  12. 12

    C #에서 List <T> 직렬화 및 js 배열로 역 직렬화

  13. 13

    파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

  14. 14

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  15. 15

    RenderedImage를 텍스트 문자열로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  16. 16

    C ++에서 두 폴더의 diff를 최적으로 직렬화하는 방법

  17. 17

    직렬화 된 List <>를 C #에서 효율적으로 압축하는 방법

  18. 18

    C #에서 int를 키로 사용하는 JSON 역 직렬화

  19. 19

    C #에서 JSON 파일 역 직렬화 및 직렬화

  20. 20

    C #으로 JSON 파일을 역 직렬화하는 방법

  21. 21

    C #에서 JSON 배열을 역 직렬화하는 방법

  22. 22

    C #에서 JSON을 역 직렬화하는 방법

  23. 23

    C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

  24. 24

    JavaScriptSerializer를 사용하여 JSON을 튜플으로 역 직렬화하는 방법

  25. 25

    특성없는 C # JSON 직렬화 및 역 직렬화

  26. 26

    WCF-ISO8583에서 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  27. 27

    현재 상태로 양식 직렬화 및 역 직렬화

  28. 28

    C #에서 과학적 표기법없이 문자열을 JObject로 역 직렬화하는 방법

  29. 29

    @@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

뜨겁다태그

보관