better serialization, but test does not work actually

This commit is contained in:
Marc Wäckerlin
2009-04-23 15:10:21 +00:00
parent a9ad45ad4d
commit 37fd5e8695
5 changed files with 473 additions and 149 deletions

View File

@@ -0,0 +1,92 @@
/*! @file
@id $Id$
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
// g++ -I../../src ../../src/xml.cxx serialization.cxx
#include <xml-cxx/xml.hxx>
#include <iostream>
#include <sstream>
class B: public xml::Serialize {
public:
int a;
std::string txt;
protected:
void initXmlMembers() {
className("b");
persist(a, "a");
persist(txt, "txt");
}
};
class B: public xml::Serialize {
public:
int a;
std::string txt;
protected:
void initXmlMembers() {
className("b");
persist(a, "a");
persist(txt, "txt");
}
};
//! Class with external xml::Serialize
class C {
public:
int a;
std::string txt;
};
int main(int, char**) {
{ // Serialization as a member
std::stringstream ss("<a>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</a>");
A a;
a._ser.loadXml(ss);
if (a.a==1234) a.a=4321;
a._ser.saveXml(std::cout)<<std::endl;
} { // Inherited Serialization
std::stringstream ss("<b>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</b>");
B b;
b.loadXml(ss);
if (b.a==1234) b.a=4321;
b.saveXml(std::cout)<<std::endl;
} { // External xml::Serialize: "ser" must live in no longer than "c"!
std::stringstream ss("<c>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</c>");
C c;
xml::Serialize ser(xml::Serialize("c")
.persist(c.a, "a")
.persist(c.txt, "txt"));
ser.loadXml(ss);
if (c.a==1234) c.a=4321;
ser.saveXml(std::cout)<<std::endl;
} { // Use xml::Serialize to store anything, e.g. local variables
// Important: "ser" must live in no longer than the variables!
std::stringstream ss("<d>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</d>");
int a;
std::string txt;
xml::Serialize ser(xml::Serialize("d")
.persist(a, "a")
.persist(txt, "txt"));
ser.loadXml(ss);
if (a==1234) a=4321;
ser.saveXml(std::cout)<<std::endl;
}
return 0;
}

View File

@@ -5,46 +5,89 @@
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
// g++ -I../../src ../../src/xml.cxx node_macros.cxx
// g++ -I../../src ../../src/xml.cxx serialization.cxx
#include <xml-cxx/xml.hxx>
#include <iostream>
#include <sstream>
/*
template<class STREAM> class Stream: public STREAM {
public:
virtual ~Stream() {}
template<typename T> virtual Stream& operator%(T& o);
};
template<class STREAM> class IStream: public Stream<STREAM> {
public:
virtual template<typename T> IStream& operator%(T& o) {
operator>>(o);
return *this;
}
};
template<class STREAM> class OStream: public Stream<STREAM> {
public:
virtual template<typename T> OStream& operator%(T& o) {
operator<<(o);
return *this;
}
};
*/
template<class STREAM, typename TYPE>
STREAM& operator%(STREAM& s, TYPE& o);
template<class STREAM, typename TYPE>
STREAM& operator%(STREAM& s, TYPE& o);
//! Class with built in xml::Serialize as member, no inheritance
class A {
public:
A(): _ser("a") {
_ser.persist(a, "a");
_ser.persist(txt, "txt");
}
int a;
std::string txt;
xml::Serialize _ser;
};
//! Class that inherits xml::Serialize
class B: public xml::Serialize {
public:
int a;
std::string txt;
protected:
void initXmlMembers() {
className("b");
persist(a, "a");
persist(txt, "txt");
}
};
//! Class with external xml::Serialize
class C {
public:
int a;
std::string txt;
};
int main(int, char**) {
{ // Serialization as a member
std::stringstream ss("<a>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</a>");
A a;
a._ser.loadXml(ss);
if (a.a==1234) a.a=4321;
a._ser.saveXml(std::cout)<<std::endl;
} { // Inherited Serialization
std::stringstream ss("<b>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</b>");
B b;
b.loadXml(ss);
if (b.a==1234) b.a=4321;
b.saveXml(std::cout)<<std::endl;
} { // External xml::Serialize: "ser" must live in no longer than "c"!
std::stringstream ss("<c>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</c>");
C c;
xml::Serialize ser(xml::Serialize("c")
.persist(c.a, "a")
.persist(c.txt, "txt"));
ser.loadXml(ss);
if (c.a==1234) c.a=4321;
ser.saveXml(std::cout)<<std::endl;
} { // Use xml::Serialize to store anything, e.g. local variables
// Important: "ser" must live in no longer than the variables!
std::stringstream ss("<d>\n"
"\t<a>1234</a>\n"
"\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
"</d>");
int a;
std::string txt;
xml::Serialize ser(xml::Serialize("d")
.persist(a, "a")
.persist(txt, "txt"));
ser.loadXml(ss);
if (a==1234) a=4321;
ser.saveXml(std::cout)<<std::endl;
}
return 0;
}