#include using namespace Upp; struct RawFoo { String x; }; struct Foo : ValueType { int x; Foo(const Nuller&) { x = Null; } Foo(int x) : x(x) {} Foo() {} String ToString() const { return AsString(x); } unsigned GetHashValue() const { return x; } void Serialize(Stream& s) { s % x; } bool operator==(const Foo& b) const { return x == b.x; } bool IsNullInstance() const { return IsNull(x); } operator Value() { return RichToValue(*this); } Foo(const Value& v) { *this = v.Get(); } }; INITBLOCK { Value::Register(); } CONSOLE_APP_MAIN { RawFoo h; h.x = "hello"; Value q = RawToValue(h); DUMP(q.Is()); DUMP(q.To().x); Value a = RichToValue(Foo(54321)); Value b = RichToValue(Foo(54321)); DUMP(a == b); DUMP(IsNull(a)); String s = StoreAsString(a); Value v; LoadFromString(v, s); DUMP(v.Get()); Value c = Foo(321); Foo x = c; DUMP(x); }