【问题标题】:boost::archive::xml_iarchive fails with an xml (deserizalisation context)boost::archive::xml_iarchive 因 xml 失败(反序列化上下文)
【发布时间】:2017-09-24 21:59:23
【问题描述】:

(我在 Windows 下并使用 Visual Studio 2015。)我收到了放在问题末尾的 xml,采用单行格式,但为了方便起见,我用notepad++ 很好地打印了(XML 仅带有换行符)。

std::ifstream file("D:\\FILES\\anxmlfile.xml");
char msg[500];
strerror_s(msg,errno);
try
{
    boost::archive::xml_iarchive ia(file);
    interestRateCurve IRCurve;
    ia >> BOOST_SERIALIZATION_NVP(IRCurve);
}
catch (boost::archive::archive_exception ex)
{
    // blah
}

msg 在哪里收到“无错误”以及在哪里

boost::archive::xml_iarchive ia(file);

使用{m_buffer=0x00e8f504 "unrecognized XML syntax" code=other_exception } 触发boost::archive::archive_exception。 interestRateCurve 类定义如下:

#pragma once

#include <string>

#include "boost/archive/text_oarchive.hpp"
#include "boost/archive/text_iarchive.hpp"

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 

class calendars
{
public:
    std::string calendar;
    template<class Archive> void serialize(Archive& archive, const unsigned int version)
    {
        archive & BOOST_SERIALIZATION_NVP(calendar);
    }
};

class curvepoint
{
public:
    std::string tenor;
    std::string maturitydate;
    double parrate;
    template<class Archive> void serialize(Archive& archive, const unsigned int version)
    {
        archive & BOOST_SERIALIZATION_NVP(tenor);
        archive & BOOST_SERIALIZATION_NVP(maturitydate);
        archive & BOOST_SERIALIZATION_NVP(parrate);
    }
};

class interestRateCurveDeposits
{
public:
    std::string daycountconvention;
    std::string snaptime;
    std::string spotdate;
    calendars m_calendars;
    curvepoint curvepoint;
    template<class Archive> void serialize(Archive& archive, const unsigned int version)
    {
        archive & BOOST_SERIALIZATION_NVP(daycountconvention);
        archive & BOOST_SERIALIZATION_NVP(snaptime);
        archive & BOOST_SERIALIZATION_NVP(spotdate);
        archive & BOOST_SERIALIZATION_NVP(m_calendars);
        archive & BOOST_SERIALIZATION_NVP(curvepoint);
    }
};

class interestRateCurveSwaps
{
public:
    std::string fixeddaycountconvention;
    std::string floatingdaycountconvention;
    std::string fixedpaymentfrequency;
    std::string floatingpaymentfrequency;
    std::string snaptime;
    std::string spotdate;
    calendars calendars[1];
    curvepoint curvepoint[1];
    template<class Archive> void serialize(Archive& archive, const unsigned int version)
    {
        archive & BOOST_SERIALIZATION_NVP(fixeddaycountconvention);
        archive & BOOST_SERIALIZATION_NVP(floatingdaycountconvention);
        archive & BOOST_SERIALIZATION_NVP(fixedpaymentfrequency);
        archive & BOOST_SERIALIZATION_NVP(floatingpaymentfrequency);
        archive & BOOST_SERIALIZATION_NVP(snaptime);
        archive & BOOST_SERIALIZATION_NVP(spotdate);
        archive & BOOST_SERIALIZATION_NVP(calendars);
        archive & BOOST_SERIALIZATION_NVP(curvepoint);
    }
};

class interestRateCurve
{
public:
    std::string effectiveasof;
    std::string currency;
    std::string baddayconvention;
    interestRateCurveDeposits deposits[1];
    interestRateCurveSwaps swaps[1];
    template<class Archive> void serialize(Archive& archive, const unsigned int version)
    {
        archive & BOOST_SERIALIZATION_NVP(effectiveasof);
        archive & BOOST_SERIALIZATION_NVP(currency);
        archive & BOOST_SERIALIZATION_NVP(baddayconvention);
        archive & BOOST_SERIALIZATION_NVP(deposits);
        archive & BOOST_SERIALIZATION_NVP(swaps);
    }
};

以下短 xml(使用提升代码 sn-p 生成)不会触发相同的错误:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="15">
<d class_id="0" tracking_level="0" version="0">
    <m_day>15</m_day>
    <m_month>8</m_month>
    <m_year>1947</m_year>
</d>
</boost_serialization>

我有问题的 xml 确实如此:

<?xml version="1.0" standalone="yes" ?>
<interestRateCurve>
    <effectiveasof>2009-01-05</effectiveasof>
    <currency>USD</currency>
    <baddayconvention>M</baddayconvention>
    <deposits>
        <daycountconvention>ACT/360</daycountconvention>
        <snaptime>2009-01-02T21:00:00.000Z</snaptime>
        <spotdate>2009-01-07</spotdate>
        <calendars>
            <calendar>none</calendar>
        </calendars>
        <curvepoint>
            <tenor>1M</tenor>
            <maturitydate>2009-02-09</maturitydate>
            <parrate>0.0043</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>2M</tenor>
            <maturitydate>2009-03-09</maturitydate>
            <parrate>0.010988</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>3M</tenor>
            <maturitydate>2009-04-07</maturitydate>
            <parrate>0.014125</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>6M</tenor>
            <maturitydate>2009-07-07</maturitydate>
            <parrate>0.017525</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>9M</tenor>
            <maturitydate>2009-10-07</maturitydate>
            <parrate>0.019063</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>1Y</tenor>
            <maturitydate>2010-01-07</maturitydate>
            <parrate>0.020238</parrate>
        </curvepoint>
    </deposits>
    <swaps>
        <fixeddaycountconvention>30/360</fixeddaycountconvention>
        <floatingdaycountconvention>ACT/360</floatingdaycountconvention>
        <fixedpaymentfrequency>6M</fixedpaymentfrequency>
        <floatingpaymentfrequency>3M</floatingpaymentfrequency>
        <snaptime>2009-01-02T21:00:00.000Z</snaptime>
        <spotdate>2009-01-07</spotdate>
        <calendars>
            <calendar>none</calendar>
        </calendars>
        <curvepoint>
            <tenor>2Y</tenor>
            <maturitydate>2011-01-07</maturitydate>
            <parrate>0.016509</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>3Y</tenor>
            <maturitydate>2012-01-07</maturitydate>
            <parrate>0.019413</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>4Y</tenor>
            <maturitydate>2013-01-07</maturitydate>
            <parrate>0.021521</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>5Y</tenor>
            <maturitydate>2014-01-07</maturitydate>
            <parrate>0.023315</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>6Y</tenor>
            <maturitydate>2015-01-07</maturitydate>
            <parrate>0.024588</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>7Y</tenor>
            <maturitydate>2016-01-07</maturitydate>
            <parrate>0.025719</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>8Y</tenor>
            <maturitydate>2017-01-07</maturitydate>
            <parrate>0.02656</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>9Y</tenor>
            <maturitydate>2018-01-07</maturitydate>
            <parrate>0.02726</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>10Y</tenor>
            <maturitydate>2019-01-07</maturitydate>
            <parrate>0.028</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>12Y</tenor>
            <maturitydate>2021-01-07</maturitydate>
            <parrate>0.02893</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>15Y</tenor>
            <maturitydate>2024-01-07</maturitydate>
            <parrate>0.029989</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>20Y</tenor>
            <maturitydate>2029-01-07</maturitydate>
            <parrate>0.030029</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>25Y</tenor>
            <maturitydate>2034-01-07</maturitydate>
            <parrate>0.029639</parrate>
        </curvepoint>
        <curvepoint>
            <tenor>30Y</tenor>
            <maturitydate>2039-01-07</maturitydate>
            <parrate>0.029505</parrate>
        </curvepoint>
    </swaps>
</interestRateCurve>

我做错了什么?格式真的错了吗?为什么?如果没有,怎么办?

编辑。封闭

<interestRateCurve>
...
</interestRateCurve>

我的 xml 中

<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="15">
...
</boost_serialization>

解决了这个问题,但对我来说当然不是一个可行的解决方案,因为我有数百万个与我正在与之抗争的 xml 格式相同的 xml...

【问题讨论】:

    标签: c++ xml boost xml-serialization boost-serialization


    【解决方案1】:

    问题是Boost没有XML库。

    您似乎认为 Boost Serialization 可以读取 XML。实际上,它只能读取 XML 文档的一个子集,即 Boost Serialization Archives,它是一种特定格式。如果你没有那个格式,你就不能使用 Boost Serialization 来读取它。

    相反,只需使用 XML 库。我建议 PugiXML 或 libxml2:

    What XML parser should I use in C++?

    【讨论】:

    • 哦,好吧,确实不知道Boost序列化只能读取XML文档的一个子集,谢谢! PugiXML 我试过了,真的没问题,但不使用预编译的头文件,这是我正在运行的大型解决方案中的一个问题。我会试一试 libxml2 :我可以在带有 mvs 的 windows 下使用它吗?你觉得stackoverflow.com/questions/28037909/xml-parsing-using-boost 怎么样?我知道,这本身不是反序列化 ...
    • 嗯。如果您使用预编译的标头,PugiXML 可以正常工作。此外,除非您不知道如何避免紧密耦合,否则这在“大型解决方案”中绝不是问题。基本上,确保您永远不会在“公共”或共享头文件中包含 XML 库头文件。仅将其包含在使用它的(一个)cpp 中。
    • 我喜欢你链接的那个答案 :) 它说的完全一样。如果您需要有关 PugiXML 的帮助,请查看 some samples I made using it。在 MSVC 下设置 Libxml2 会有点困难
    • "如果你使用预编译的头文件,PugiXML 可以正常工作" --> 怎么样?我有这里描述的预编译头问题github.com/zeux/pugixml/blob/master/docs/manual.adoc 和他们提供的唯一解决方案是禁用编译头。老实说,我什至不想尝试在我工作的解决方案中查看这方面的内容。
    • 我确实误读了......你是对的,我做我想做的事,使用预编译的头文件,使用 pugixml !非常感谢指出我的愚蠢,有时它真的很有用;-)
    【解决方案2】:
    std::ifstream file("D:\\FILES\\anxmlfile.xml");
    char msg[500];
    strerror_s(msg,errno);
    try
    {
        unsigned int flags = boost::archive::no_header;
        boost::archive::xml_iarchive ia(file, flags);
        interestRateCurve IRCurve;
        ia >> BOOST_SERIALIZATION_NVP(IRCurve);
    }
    catch (boost::archive::archive_exception ex)
    {
        // blah
    }
    

    成功了,然后

    ia >> BOOST_SERIALIZATION_NVP(IRCurve);
    

    触发“输入流错误”code=input_stream_error”。我不知道是不是因为 interestRateCurve 类的设计不好,因此无法完成这项工作,或者我的答案根本不是正确答案,导致“坏”bst::archive::xml_iarchive? (bst::archive::xml_iarchive 在调试时看起来很正常。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2023-03-30
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多