Я могу сериализировать карту STL в MFC с помощью CArchive?

Это мой рабочий класс @Configuration для обработки запросов CORS, используемых только в среде разработки.

@Configuration
//@Profile(PROFILE_DEV)
  public class CorsConfiguration {

  @Bean
  public WebMvcConfigurer corsConfigurer() {
      return new WebMvcConfigurer() {
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              registry.addMapping("/**")
                  .allowedOrigins("*")
                  .allowedHeaders("*")
                  .allowedMethods("*");
          }
      };
  }
}

Вы также должны настроить Spring Security на игнорирование HttpMethod.OPTIONS, используемого запросом предполетной проверки (в качестве исключения, которое вы упомянули)

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  //...
    @Override
    public void configure(WebSecurity web) throws Exception {
      web.ignoring()
            //others if you need
            .antMatchers(HttpMethod.OPTIONS, "/**");

    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .exceptionHandling()
            .and()
            .headers()
            .frameOptions()
            .disable()
            .and()
            .authorizeRequests()
            .antMatchers("/api/register").permitAll()
            .antMatchers("/api/activate").permitAll()
            .antMatchers("/api/authenticate").permitAll()
            .antMatchers("/api/**").authenticated();
    }

}

Потому что, когда вы используете cors, у вас есть Simple Request и Предварительно выданный запрос , который запускает HttpMethod.OPTIONS

6
задан Pieter 4 November 2008 в 08:39
поделиться

2 ответа

В MFC я полагаю, что является самым легким сначала сериализировать размер карты и затем затем выполнить итерации через все элементы.

Вы не указывали, используете ли Вы std::map или MFC CMap, но версия на основе std::map мог быть похожим на это:

void MyClass::Serialize(CArchive& archive)
{
  CObject::Serialize(archive);
  if (archive.IsStoring()) {
    archive << m_map.size(); // save element count
    std::map<int, MapData>::const_iterator iter = m_map.begin(), 
                                           iterEnd = m_map.end();
    for (; iter != iterEnd; iter++) {
      archive << iter->first << iter->second;
    }
  }
  else {
    m_map.clear();
    size_t mapSize = 0;
    archive >> mapSize; // read element count
    for (size_t i = 0; i < mapSize; ++i) {
      int key;
      MapData value;
      archive >> key;
      archive >> value;
      m_map[key] = value;
    }
  }
}

Если бы ошибка происходит при чтении архива, одна из операций потоковой передачи должна выдать исключение, которое было бы затем поймано платформой на более высоком уровне.

7
ответ дан 16 December 2019 в 21:47
поделиться

Я не знаю много о MFC, но Ваша проблема скорее тривиально решена с помощью Повышения. Сериализация

struct MapData {
     int m_int;
     std::string m_str;

  private: 
    friend class boost::serialization::access; 

    template<class Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
        ar & m_int; 
        ar & m_str; 
    } 
};

std::map< int, MapData > theData;

template<class Archive>
void serialize(Archive & ar, std::map< int, MapData > & data, const unsigned int version)
{
    ar & data;
}

И затем позже были Вы, хотят сделать реальную архивацию:

std::ofstream ofs("filename"); 
boost::archive::binary_oarchive oa(ofs); 
oa << theData; 

Именно.

(правовая оговорка: кодируйте просто введенный в этом поле, не протестированном вообще, опечатка были предназначены ;)

1
ответ дан 16 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: