Opened 6 years ago

Closed 5 years ago

Last modified 5 years ago

#12438 closed Bugs (fixed)

Wrong additional closing tag in boost::archive::xml_woarchive

Reported by: anonymous Owned by: Robert Ramey
Milestone: To Be Determined Component: serialization
Version: Boost 1.62.0 Severity: Problem
Keywords: Cc: juergen.flieser@…

Description

boost::archive::xml_woarchive writes an additional line &lt;/boost_serialization&gt; after the closing tag </boost_serialization> The output of boost::archive::xml_oarchive is correct.

The ouput of xml_woarchive is

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<w_foo class_id="0" tracking_level="0" version="0"></w_foo>
</boost_serialization>
&lt;/boost_serialization&gt;

The source code is

// Boost:   1.62.0 BETA1
//
// Toolset: Microsoft Visual C++
//          Microsoft Visual Studio Professional 2015
//          Version 14.0.25425.01 Update 3
//          Visual C++ 2015   00325 - 60002 - 24764 - AA687
//          Microsoft Visual C++ 2015
// Behavior is in all configurations 32bit/64bit and debug/release
//
// ====================================================================

// Needed for <boost/archive/tmpdir.hpp>
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <fstream>
#include <string>

#include <boost/archive/tmpdir.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_woarchive.hpp>
// ====================================================================
class foo
{
public:
  foo() {};
  template<class Archive>
  void serialize(Archive &ar, const unsigned int version) {}
};
// --------------------------------------------------------------------
void save_sfoo(const foo& s_foo, const std::string& filename)
{
  std::ofstream ofs(filename);
  boost::archive::xml_oarchive oa(ofs);
  oa << BOOST_SERIALIZATION_NVP(s_foo);
}
// --------------------------------------------------------------------
void save_wfoo(const foo& w_foo,  const std::string& filename)
{
  std::wofstream ofs(filename);
  boost::archive::xml_woarchive oa(ofs);
  oa << BOOST_SERIALIZATION_NVP(w_foo);
}
// ====================================================================
int main(int argc, char *argv[])
{
  foo some_foo;
  std::string savedir(boost::archive::tmpdir());

  std::cout << "Saving s_foo.xml and w_foo.xml to directory <" << savedir << ">" << std::endl;
      
  save_sfoo(some_foo, savedir + "/sfoo.xml");
  save_wfoo(some_foo, savedir + "/wfoo.xml");

  return 0;
}

// ====================================================================
// Files created are 
// ====================================================================
// "sfoo.xml"
// --------------------------------------------------------------------
/*
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<s_foo class_id="0" tracking_level="0" version="0"></s_foo>
</boost_serialization>


*/
// --------------------------------------------------------------------
// "wfoo.xml"
// --------------------------------------------------------------------
/*
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<w_foo class_id="0" tracking_level="0" version="0"></w_foo>
</boost_serialization>
&lt;/boost_serialization&gt;


*/

Change History (6)

comment:1 by Robert Ramey, 6 years ago

this is clearly an error. I thought I fixed this in the final release of 1.61. Are you sure that you're not using one of pre-release betas? Does the issue still show up in the develop branch?

comment:2 by anonymous, 6 years ago

The reported error is Boost 1.62 release (when I reported the error Boost 1.62 beta was in use).

comment:3 by Robert Ramey, 6 years ago

Did you upgrade to the 1.62 final? The log shows that a fix was checked into the master (32b2bda) on April 21,2016. Is this fix not in your code? or does the "fix" fail to address the issue?

comment:4 by anonymous, 6 years ago

The latest 1.62 release we upgraded to is the final one, it is not a beta. We loaded it from https://sourceforge.net/projects/boost/files/boost-binaries/1.62.0/boost_1_62_0-bin-msvc-all-32-64.7z/download The timestamp is 2016-09-26. It has not been updated since then.

comment:5 by Robert Ramey, 5 years ago

Resolution: fixed
Status: newclosed

I've just tested this on my version on the develop branch and it IS fixed there.

I recently realized that due to an oversight on my part, some fixes on my local develop branch weren't merged and pushed. But I think that's fixed now. Unfortunately, this isn't in the latest release but it should be in the next one for sure.

Robert Ramey

comment:6 by jaroslav.beran@…, 5 years ago

I found same bug in version 1.62. I tried to use version 1.64 (downloaded from https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.7z) with same result (additional line).

I've modified the file .\boost_1_64_0\boost\archive\impl\xml_woarchive_impl.ipp as shown below and it works fine for me now.

#ifndef BOOST_NO_INTRINSIC_WCHAR_T
template<class Archive>
BOOST_WARCHIVE_DECL void
xml_woarchive_impl<Archive>::save(const wchar_t * ws){

os << ws;

/* next lines commented out to fix #12438 Wrong additional closing tag in boost::archive::xml_woarchive */
#if 0

typedef iterators::xml_escape<const wchar_t *> xmbtows;
std::copy(

xmbtows(ws),
xmbtows(ws + std::wcslen(ws)),
boost::archive::iterators::ostream_iterator<wchar_t>(os)

);

#endif
}

#endif

Note: See TracTickets for help on using tickets.