Changeset 51

Show
Ignore:
Timestamp:
06/26/08 16:35:27 (2 months ago)
Author:
baxissimo
Message:

First rev of the BinaryArchive?.
Main problem left to solve is how to handle platform-specific types like size_t (aka the diff between 32bit vs 64bit platforms) and the different flavors of real which are 80bits on intel with DMD, but 64 bits with GDC, I think.
Endian-ness is handled, but for now writing is always done in native-endian format.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/doost/util/serializer/Serializer.d

    r44 r51  
    212212        this() { 
    213213            registry = new Registry; 
     214            static if(is(typeof(init()))) { 
     215                bool ret = init(); 
     216                if (!ret) { 
     217                    throw new SerializerException("Could not init archiver"); 
     218                } 
     219            } 
    214220        } 
    215221 
  • trunk/dsss.conf

    r38 r51  
    1 [examples/database/PackageTest.d] 
    2 buildflags+=-Ic:/DLanguage/import/ddbi 
    3 buildflags+=-version=dbi_sqlite 
    4 buildflags+=-full 
    5 buildflags+=-Jexamples/database 
     1name=doost 
     2[doost] 
     3type=sourcelibrary 
  • trunk/examples/util/serializer/FunctionTest.d

    r44 r51  
    1313 
    1414 ******************************************************************************/ 
     15module FunctionTest; 
    1516 
    1617import std.traits; 
     
    2425import doost.util.serializer.archive.TextArchive; 
    2526import doost.util.serializer.archive.JsonArchive; 
     27import doost.util.serializer.archive.BinaryArchive; 
    2628import doost.text.Scanner; 
    2729 
     
    327329//Serializer!(JsonArchive, dstring) jsondserializer; 
    328330Serializer!(JsonArchiveExt) jsonextserializer; 
     331Serializer!(BinaryArchive, ubyte[]) binserializer; 
    329332 
    330333static this() { 
    331      serializer = new Serializer!(TextArchive); 
    332      //wserializer = new Serializer!(TextArchive, wstring); 
    333      //dserializer = new Serializer!(TextArchive, dstring); 
    334      extserializer = new Serializer!(TextArchiveExt); 
    335      jsonserializer = new Serializer!(JsonArchive); 
    336      //jsonwserializer = new Serializer!(JsonArchive, wstring); 
    337      //jsondserializer = new Serializer!(JsonArchive, dstring); 
    338      jsonextserializer = new Serializer!(JsonArchiveExt); 
     334    serializer = new typeof(serializer); 
     335    //wserializer = new typeof(wserializer); 
     336    //dserializer = new typeof(dserializer); 
     337    extserializer = new typeof(extserializer); 
     338    jsonserializer = new typeof(jsonserializer); 
     339    //jsonwserializer = new typeof(jsonwserializer); 
     340    //jsondserializer = new typeof(jsondserializer); 
     341    jsonextserializer = new typeof(jsonextserializer); 
     342    binserializer = new typeof(binserializer); 
    339343} 
    340344 
     
    17301734//------------------------------------------------------------------------------ 
    17311735 
     1736//------------------------------------------------------------------------------ 
     1737 
     1738unittest { 
     1739    testGroup.begin("Binary Archive"); 
     1740} 
     1741 
     1742//------------------------------------------------------------------------------ 
     1743 
     1744unittest { testCase.execute("load/dump - string/wstring/dstring", { 
     1745    string input; 
     1746    ubyte[] output; 
     1747    wstring winput; 
     1748    dstring dinput; 
     1749 
     1750 
     1751    input  = "pójdźŌe, kiń tę chmurność w głĠ
     1752b flaszy!"; 
     1753    winput  = "pójdźŌe, kiń tę chmurność w głĠ
     1754b flaszy!"w; 
     1755    dinput  = "pójdźŌe, kiń tę chmurność w głĠ
     1756b flaszy!"d; 
     1757    output = binserializer.dump(input); 
     1758    trace(output); 
     1759    assert(binserializer.load!(string)(output) == input); 
     1760    output = binserializer.dump(winput); 
     1761    trace(output); 
     1762    assert(binserializer.load!(wstring)(output) == winput); 
     1763    output = binserializer.dump(dinput); 
     1764    trace(output); 
     1765    assert(binserializer.load!(dstring)(output) == dinput); 
     1766});} 
     1767 
     1768//------------------------------------------------------------------------------ 
     1769 
     1770unittest { testCase.execute("load/dump - bool", { 
     1771    bool input; 
     1772    ubyte[] output; 
     1773 
     1774    input = true; 
     1775    output = binserializer.dump(input); 
     1776    assert(binserializer.load!(bool)(output) == input); 
     1777 
     1778    input = false; 
     1779    output = binserializer.dump(input); 
     1780    assert(binserializer.load!(bool)(output) == input); 
     1781});} 
     1782 
     1783////------------------------------------------------------------------------------ 
     1784 
     1785unittest { testCase.execute("load/dump - char", { 
     1786    char input; 
     1787    ubyte[] output; 
     1788 
     1789    input = 'a'; 
     1790    output = binserializer.dump(input); 
     1791    assert(binserializer.load!(char)(output) == input); 
     1792 
     1793    input = 'A'; 
     1794    output = binserializer.dump(input); 
     1795    assert(binserializer.load!(char)(output) == input); 
     1796});} 
     1797 
     1798//------------------------------------------------------------------------------ 
     1799 
     1800import std.stdio; 
     1801unittest { testCase.execute("load/dump - atomic types", { 
     1802    int input_int; 
     1803    uint input_uint; 
     1804    float input_float; 
     1805    cfloat input_cfloat; 
     1806    real input_real; 
     1807    creal input_creal; 
     1808    ireal input_ireal; 
     1809 
     1810    ubyte[] output; 
     1811 
     1812    input_int = -15; 
     1813    output = binserializer.dump(input_int); 
     1814    assert(binserializer.load!(int)(output) == input_int); 
     1815 
     1816    input_uint = 1774; 
     1817    output = binserializer.dump(input_uint); 
     1818    assert(binserializer.load!(uint)(output) == input_uint); 
     1819 
     1820    input_float = 1.123; 
     1821    output = binserializer.dump(input_float); 
     1822    assert(binserializer.load!(float)(output) == input_float); 
     1823 
     1824    input_real = 3.14159_26535_89793_23846_26433_83279_50288_41971_69399; 
     1825    output = binserializer.dump(input_real); 
     1826    assert(binserializer.load!(real)(output) == input_real); 
     1827 
     1828    input_cfloat = 1774 + 12.fi; 
     1829    output = binserializer.dump(input_cfloat); 
     1830    assert(binserializer.load!(cfloat)(output) == input_cfloat); 
     1831 
     1832    input_creal = 1774 + 12i; 
     1833    output = binserializer.dump(input_creal); 
     1834    assert(binserializer.load!(creal)(output) == input_creal); 
     1835 
     1836    input_ireal = 1774i; 
     1837    output = binserializer.dump(input_ireal); 
     1838    assert(binserializer.load!(ireal)(output) == input_ireal); 
     1839});} 
     1840 
     1841//------------------------------------------------------------------------------ 
     1842unittest { testCase.execute("load/dump - int arrays", { 
     1843    int[] input_int1; 
     1844    int[][] input_int2; 
     1845    int[][][] input_int3; 
     1846    OpaqueClass[] input_class1; 
     1847    TransparentClass[] input_class2; 
     1848    OpaqueStruct[] input_struct1; 
     1849 
     1850    ubyte[] output; 
     1851 
     1852    input_int1 = [-1,45,34,-100,34]; 
     1853    output = binserializer.dump(input_int1); 
     1854    trace(output); 
     1855    //trace(binserializer.load!(int[])(output)); 
     1856    assert(binserializer.load!(int[])(output) == input_int1); 
     1857 
     1858 
     1859    input_int2 = [[], [], []]; 
     1860    output = binserializer.dump(input_int2); 
     1861    assert(binserializer.load!(int[][])(output) == input_int2); 
     1862 
     1863 
     1864    input_int3 = [[[2,3],[4,5],[6,7]], [[]], [[0,-5],[-8,1]]]; 
     1865    output = binserializer.dump(input_int3); 
     1866    assert(binserializer.load!(int[][][])(output) == input_int3); 
     1867 
     1868 
     1869    //BUG: low precision: -5642.2321 would be wrong value 
     1870    auto oc1 = new OpaqueClass(-567, float.nan, "class1", 22, -43); 
     1871    auto oc2 = new OpaqueClass(234, 0.11, "class2", 28, -27); 
     1872    auto oc3 = new OpaqueClass(2121, -4.00, "class1", 0, 21); 
     1873    input_class1 = [oc1, oc2, oc3, null, null, oc1, oc1]; 
     1874    output = binserializer.dump(input_class1); 
     1875    trace(output); 
     1876    auto pom = binserializer.load!(OpaqueClass[])(output); 
     1877    trace(binserializer.dump(pom)); 
     1878    assert(compareArrays(binserializer.load!(OpaqueClass[])(output), input_class1)); 
     1879 
     1880    auto tc1 = new TransparentClass(-567, -5642.23, "class1", 22, -43); 
     1881    auto tc2 = new TransparentClass(2121, -4.00, "class2", 0, 21); 
     1882 
     1883    input_class2 = [tc1, null, tc2]; 
     1884    output = binserializer.dump(input_class2); 
     1885    trace(output); 
     1886    assert(compareArrays(binserializer.load!(TransparentClass[])(output), input_class2)); 
     1887});} 
     1888 
     1889//------------------------------------------------------------------------------ 
     1890 
     1891unittest { testCase.execute("load/dump - class arrays", { 
     1892    OpaqueClass[] input_class1; 
     1893    TransparentClass[] input_class2; 
     1894    OpaqueStruct[] input_struct1; 
     1895 
     1896    ubyte[] output; 
     1897 
     1898    //BUG: low precision: -5642.2321 would be wrong value 
     1899    auto oc1 = new OpaqueClass(-567, -5642.23, "class1", 22, -43); 
     1900    auto oc2 = new OpaqueClass(234, 0.11, "class2", 28, -27); 
     1901    auto oc3 = new OpaqueClass(2121, -4.00, "class1", 0, 21); 
     1902    input_class1 = [oc1, oc2, oc3, null, null, oc1, oc1]; 
     1903    output = binserializer.dump(input_class1); 
     1904    trace(output); 
     1905    //TODO: zmienić nazwę z compareArrays 
     1906    assert(compareArrays(binserializer.load!(OpaqueClass[])(output), input_class1)); 
     1907 
     1908    auto tc1 = new TransparentClass(-567, -5642.23, "class1", 22, -43); 
     1909    auto tc2 = new TransparentClass(2121, -4.00, "class2", 0, 21); 
     1910 
     1911    input_class2 = [tc1, null, tc2]; 
     1912    output = binserializer.dump(input_class2); 
     1913    trace(output); 
     1914    assert(compareArrays(binserializer.load!(TransparentClass[])(output), input_class2)); 
     1915});} 
     1916 
     1917//------------------------------------------------------------------------------ 
     1918 
     1919unittest { testCase.execute("load/dump - static arrays", { 
     1920    string[6] input_string; 
     1921    real[3] input_real; 
     1922    int[4] input_int; 
     1923    TransparentComposedStruct[3] input_cstruct; 
     1924    OpaqueComposedStruct[3] input_ocstruct; 
     1925 
     1926    ubyte[] output; 
     1927 
     1928    input_int[0]=5; input_int[1]=10; input_int[2]=15; input_int[3]=20; 
     1929    output = binserializer.dump(input_int); 
     1930    assert(binserializer.load!(int[5])(output) == input_int); 
     1931 
     1932    input_string[0]="Raz"; input_string[1]="Dwa"; input_string[2]="Trzy"; 
     1933    input_string[3]="Cztery"; input_string[4]="Pięć"; input_string[5]="Sześć"; 
     1934    output = binserializer.dump(input_string); 
     1935    assert(binserializer.load!(string[6])(output) == input_string); 
     1936 
     1937    input_real[0]=3.14; input_real[0]=2.01; input_real[0]=-15.76; 
     1938    output = binserializer.dump(input_real); 
     1939    assert(binserializer.load!(real[6])(output) == input_real); 
     1940 
     1941    input_cstruct[0]=TransparentComposedStruct([1,2,3,4,5]); 
     1942    input_cstruct[1]=TransparentComposedStruct([-100, -99, -98, -97, 0]); 
     1943    input_cstruct[2]=TransparentComposedStruct([1,22,333,4444,55555]); 
     1944    output = binserializer.dump(input_cstruct); 
     1945    assert(binserializer.load!(TransparentComposedStruct[3])(output) == input_cstruct); 
     1946 
     1947    input_ocstruct[0]=OpaqueComposedStruct([6,7,8,9,10]); 
     1948    input_ocstruct[1]=OpaqueComposedStruct([-1000, +900, -800, +700, 0]); 
     1949    input_ocstruct[2]=OpaqueComposedStruct([-1,-22,-333,-4444,-55555]); 
     1950    output = binserializer.dump(input_ocstruct); 
     1951    assert(binserializer.load!(OpaqueComposedStruct[3])(output) == input_ocstruct); 
     1952});} 
     1953 
     1954//------------------------------------------------------------------------------ 
     1955 
     1956unittest { testCase.execute("load/dump - associative arrays", { 
     1957    char[][int] input, result; 
     1958    ubyte[] output; 
     1959 
     1960    input = [1 : "Maciek"[], 2 : "Paweł", 45 : "Renata"]; 
     1961    output = binserializer.dump(input); 
     1962    result = binserializer.load!(char[][int])(output); 
     1963    assert(result.keys == [1,2,45]); 
     1964    assert(result.values == ["Maciek"[], "Paweł", "Renata"]); 
     1965    //assert(result == input_1); 
     1966});} 
     1967 
     1968//------------------------------------------------------------------------------ 
     1969 
     1970unittest { testCase.execute("load/dump - transparent classes", { 
     1971    TransparentClass input; 
     1972    ubyte[] output; 
     1973 
     1974    input = new TransparentClass(-21, 2.11, "text1", 128, -127); 
     1975    output = binserializer.dump(input); 
     1976    assert(binserializer.load!(TransparentClass)(output) == input); 
     1977});} 
     1978 
     1979//------------------------------------------------------------------------------ 
     1980 
     1981unittest { testCase.execute("load/dump - opaque classes", { 
     1982    OpaqueClass input; 
     1983    ubyte[] output; 
     1984 
     1985    input = new OpaqueClass(-21, 2.11, "text1", 128, -127); 
     1986    output = binserializer.dump(input); 
     1987    assert(binserializer.load!(OpaqueClass)(output) == input); 
     1988});} 
     1989 
     1990//------------------------------------------------------------------------------ 
     1991 
     1992unittest { testCase.execute("load/dump - transparent structs", { 
     1993    TransparentStruct input; 
     1994    ubyte[] output; 
     1995 
     1996    input = TransparentStruct(-21, 2.11, "text1"); 
     1997    output = binserializer.dump(input); 
     1998    assert(binserializer.load!(TransparentStruct)(output) == input); 
     1999});} 
     2000 
     2001//------------------------------------------------------------------------------ 
     2002 
     2003unittest { testCase.execute("load/dump - opaque structs", { 
     2004    OpaqueStruct input; 
     2005    ubyte[] output; 
     2006 
     2007    input = OpaqueStruct(-21, 2.11, "text1"); 
     2008    output = binserializer.dump(input); 
     2009    trace(output); 
     2010    assert(binserializer.load!(OpaqueStruct)(output) == input); 
     2011});} 
     2012 
     2013//------------------------------------------------------------------------------ 
     2014 
     2015unittest { testCase.execute("load/dump - typedefs", { 
     2016    typedef int MyInt; 
     2017    typedef string MyString; 
     2018    typedef OpaqueStruct OS; 
     2019    typedef OpaqueClass OC; 
     2020 
     2021    MyInt input_int; 
     2022    MyString input_string; 
     2023    OS input_struct; 
     2024    OC input_class; 
     2025 
     2026    ubyte[] output; 
     2027 
     2028    input_int = 45; 
     2029    output = binserializer.dump(input_int); 
     2030    assert(binserializer.load!(MyInt)(output) == input_int); 
     2031 
     2032    input_string = cast(MyString)"my string".dup; 
     2033    output = binserializer.dump(input_string); 
     2034    assert(binserializer.load!(MyString)(output) == input_string); 
     2035 
     2036    input_struct = OS(-21, 2.11, "text1");; 
     2037    output = binserializer.dump(input_struct); 
     2038    assert(binserializer.load!(OS)(output) == input_struct); 
     2039 
     2040    input_class = cast(OC) new OpaqueClass(-21, 2.11, "text1", 23,98); 
     2041    output = binserializer.dump(input_class); 
     2042    //BUG: dmd hangs here... 
     2043    //assert(binserializer.load!(OC)(output) == input_class); 
     2044});} 
     2045 
     2046//------------------------------------------------------------------------------ 
     2047 
     2048unittest { testCase.execute("load/dump - pointers", { 
     2049    OpaqueStruct* input_struct; 
     2050    OpaqueClass input_class; 
     2051    OpaqueClass* p; 
     2052    int*[] input_pint; 
     2053    ubyte[] output; 
     2054    int[4] ints = [23, 56, 89, 76]; 
     2055    int**[] input_ppint; 
     2056 
     2057 
     2058    input_pint = [&ints[0], &ints[1], null, &ints[2], &ints[3], &ints[1], &ints[2], &ints[1]]; 
     2059    output = binserializer.dump(input_pint); 
     2060    trace(output); 
     2061 
     2062    foreach(i, v; binserializer.load!(int*[])(output)) { 
     2063        if (v is null || input_pint[i] is null) { 
     2064            //trace("Values: ", v, " == ", input_pint[i]); 
     2065            assert(v is input_pint[i]); 
     2066            continue; 
     2067        } 
     2068        //trace("Values: ", *v, " == ", *input_pint[i]); 
     2069        assert(*v == *input_pint[i]); 
     2070    } 
     2071 
     2072    input_ppint = [&input_pint[0], &input_pint[1], &input_pint[2], &input_pint[6], &input_pint[7]]; 
     2073    output = binserializer.dump(input_ppint); 
     2074    trace(output); 
     2075    foreach(i, v; binserializer.load!(int**[])(output)) { 
     2076        if (v is null || input_ppint[i] is null) { 
     2077            trace("Values: ", v, " == ", input_ppint[i]); 
     2078            assert(v is input_ppint[i]); 
     2079            continue; 
     2080        } 
     2081 
     2082        if (*v is null || *input_ppint[i] is null) { 
     2083            trace("Values: ", *v, " == ", *input_ppint[i]); 
     2084            assert(*v is *input_ppint[i]); 
     2085            continue; 
     2086        } 
     2087 
     2088        trace("Values: ", **v, " == ", **input_ppint[i]); 
     2089        assert(**v == **input_ppint[i]); 
     2090    } 
     2091 
     2092    input_struct = &OpaqueStruct(-21, 2.11, "text1"); 
     2093    output = binserializer.dump(input_struct); 
     2094    trace(output); 
     2095    assert(*binserializer.load!(OpaqueStruct*)(output) == *input_struct); 
     2096 
     2097    input_class = new OpaqueClass(-123, 0, "opaque class", 64, 0); 
     2098    p = &input_class; 
     2099    output = binserializer.dump(p); 
     2100    trace(output); 
     2101    assert(*binserializer.load!(OpaqueClass*)(output) == input_class); 
     2102 
     2103    //TODO: sprawdzić czy dobrze zachowujÄ 
     2104 się takie typy jak Class**** 
     2105});} 
     2106 
     2107//------------------------------------------------------------------------------ 
     2108 
     2109unittest { testCase.execute("load/dump - tracking", { 
     2110    binserializer.global().tracking = Tracking.OFF; 
     2111 
     2112    OpaqueStruct* input_struct; 
     2113    int*[] input_pint; 
     2114    ubyte[] output; 
     2115    int[4] ints = [23, 56, 89, 76]; 
     2116 
     2117    input_pint = [&ints[0], &ints[1], null, &ints[2], &ints[3], &ints[1], &ints[2], &ints[1]]; 
     2118    output = binserializer.dump(input_pint); 
     2119 
     2120    foreach(i, v; binserializer.load!(int*[])(output)) { 
     2121        if (v is null || input_pint[i] is null) { 
     2122            trace("Values: ", v, " == ", input_pint[i]); 
     2123            assert(v is input_pint[i]); 
     2124            continue; 
     2125        } 
     2126        trace("Values: ", *v, " == ", *input_pint[i]); 
     2127        assert(*v == *input_pint[i]); 
     2128    } 
     2129 
     2130    input_struct = &OpaqueStruct(-21, 2.11, "text1"); 
     2131    output = binserializer.dump(input_struct); 
     2132    trace(output); 
     2133    assert(*binserializer.load!(OpaqueStruct*)(output) == *input_struct); 
     2134});} 
     2135 
     2136//------------------------------------------------------------------------------ 
     2137 
     2138unittest { testCase.execute("load/dump - classes with methods load/dump", { 
     2139    auto input = new TransparentWithLoadDump; 
     2140    ubyte[] output; 
     2141 
     2142    input.login = "marcin"; input.password = "gÅŒegŌółka"; 
     2143    output = binserializer.dump(input); 
     2144    trace(output); 
     2145    trace(binserializer.load!(TransparentWithLoadDump)(output)); 
     2146    assert(binserializer.load!(TransparentWithLoadDump)(output) == input); 
     2147});} 
     2148 
     2149//------------------------------------------------------------------------------ 
     2150 
     2151unittest { testCase.execute("load/dump - non default class constructor", { 
     2152    NonDefaultConstructor input; 
     2153    ubyte[] output; 
     2154 
     2155    binserializer.global().typeDescription!(NonDefaultConstructor).ctor = delegate NonDefaultConstructor () { 
     2156        return new NonDefaultConstructor("Some string", 65); 
     2157    }; 
     2158 
     2159    input = new NonDefaultConstructor("Some string", 65); 
     2160    input.a = "Other string"; 
     2161    input.b = 66; 
     2162    output = binserializer.dump(input); 
     2163    assert(binserializer.load!(NonDefaultConstructor)(output) == input); 
     2164 
     2165    //TODO: add also possibility to create structs; currently it's not necessary 
     2166    //but when structs will have constructors... 
     2167});} 
     2168 
     2169//------------------------------------------------------------------------------ 
     2170 
     2171unittest { testCase.execute("load/dump - struct/class versioning", { 
     2172    VersionedClass_v1 input; 
     2173    ubyte[] output; 
     2174 
     2175    //It is possible to do below; version property defined in below way 
     2176    //is more important than defined in class itself. 
     2177    //binserializer.global().typeDescription!(VersionedClass_v1).ver = 1; 
     2178 
     2179    input = new VersionedClass_v1; input.a = "Text"; input.b = 12; 
     2180    output = binserializer.dump(input); 
     2181    assert(binserializer.load!(VersionedClass_v1)(output) == input); 
     2182 
     2183/+ 
     2184    assert(binserializer.load!(VersionedClass_v1)("[\"Text\", 12]") == input); 
     2185    assert(checkAssert({ binserializer.load!(VersionedClass_v1)("(0)[\"Text\", 12]");}) ); 
     2186    assert(binserializer.load!(VersionedClass_v1)("(1)[\"Text\", 12]") == input); 
     2187    assert(checkException!(Exception)({binserializer.load!(VersionedClass_v1)("(2)[\"Text\", 12]");})); 
     2188    assert(checkException!(Exception)({binserializer.load!(VersionedClass_v1)("(-1)[\"Text\", 12]");})); 
     2189+/ 
     2190});} 
     2191 
     2192//------------------------------------------------------------------------------ 
     2193 
     2194unittest { testCase.execute("load/dump - versioned struct/class import", { 
     2195    VersionedClass_v2 input; 
     2196    ubyte[] output; 
     2197 
     2198    //BUG: doesn't work without () near global: 
     2199    //binserializer.global().typeDescription!(VersionedClass2).ver = 2; 
     2200 
     2201    input = new VersionedClass_v2; input.a = "Text"; input.b = 12; input.c = "Import"; input.d=true; 
     2202    output = binserializer.dump(input); 
     2203    assert(binserializer.load!(VersionedClass_v2)(output) == input); 
     2204/+ 
     2205    assert(checkException!(Exception)({binserializer.load!(VersionedClass_v2)("[\"Text\"]");})); 
     2206    assert(binserializer.load!(VersionedClass_v2)("(2)[\"Text\", 12, \"Import\", true]") == input); 
     2207    assert(binserializer.load!(VersionedClass_v2)("(1)[\"Text\", 12]") == input); 
     2208+/ 
     2209    //TODO: dodatkowe testy zachowania się gdy jest zdefniowany globalna wersja 
     2210    //oraz w klasie - globalna powinna mieć pierwszeństwo 
     2211});} 
     2212 
     2213//------------------------------------------------------------------------------ 
     2214/+ 
     2215TODO: Custom loaders/dumpers don't work with binary 
     2216unittest { testCase.execute("load/dump - custom loaders/dumpers", { 
     2217    MyClass input; 
     2218    ubyte[] output; 
     2219 
     2220    binserializer.global().typeDescription!(MyClass).loader = 
     2221        delegate bool (ref MyClass value, binserializer.Archive archive) { 
     2222            value = new MyClass; 
     2223 
     2224            void check(bool res) { 
     2225                if (!res) throw new Exception("Format for my class is not correct!"); 
     2226            } 
     2227 
     2228            skip(archive.storage, archive.defSkip.p_skip); 
     2229            check(archive.traverse(value.x)); 
     2230            check(skip(archive.storage, "-") != 0); 
     2231            check(archive.traverse(value.y)); 
     2232            check(skip(archive.storage, "-") != 0); 
     2233            check(archive.traverse(value.z)); 
     2234 
     2235            //TODO: rethink visibility of methods; e.g. traverse to Archive?? 
     2236            return true; 
     2237        }; 
     2238 
     2239    binserializer.global().typeDescription!(MyClass).dumper = 
     2240        delegate bool (ref MyClass value, binserializer.Archive archive) { 
     2241            archive.storage.put(format("%d-%d-%d", value.x, value.y, value.z)); 
     2242            return true; 
     2243        }; 
     2244 
     2245    input = new MyClass; input.x = 5; input.y = 10; input.z = 15; 
     2246    output = binserializer.dump(input); 
     2247    trace(output); 
     2248    assert(output == "5-10-15"); 
     2249    assert(binserializer.load!(MyClass)(output) == input); 
     2250});} 
     2251+/ 
     2252 
     2253 
     2254 
    17322255unittest { 
    17332256    testSuite.finish;