ValueTree::writeToStream with Array<var> fails


#1

The following code jasserts at the end, am I doing something wrong?

void SineSynthAudioProcessor::getStateInformation (MemoryBlock& destData)
{
	ValueTree vt("state");
	Array<var> temp;
	for (int i = 0; i < m_data.size(); ++i)
		temp.add(m_data[i]);
	vt.setProperty("data0", temp, nullptr);
	MemoryOutputStream ms(destData,false);
	vt.writeToStream(ms);
	ValueTree foo = ValueTree::readFromData(destData.getData(), destData.getSize());
	jassert(foo.isValid());
	jassert(foo.getProperty("data0").isArray());
	{
		Array<var> bar = foo.getProperty("data0").getArray();
		jassert(bar.size() == m_data.size());
	}
}

Or doesn’t ValueTree::writeToStream support properties that are arrays? Shouldn’t there be an internal JUCE jassert in that case like there is when attempting to serialize the tree to xml?


#2

XML doesn’t have syntax support for arrays.
I think you’ll hit this assertion if you write it to XML:

void NamedValueSet::copyToXmlAttributes (XmlElement& xml) const
{
    for (auto& i : values)
    {
        if (auto* mb = i.value.getBinaryData())
        {
            xml.setAttribute ("base64:" + i.name.toString(), mb->toBase64Encoding());
        }
        else
        {
            // These types can't be stored as XML!
            jassert (! i.value.isObject());
            jassert (! i.value.isMethod());
            jassert (! i.value.isArray());

            xml.setAttribute (i.name.toString(),
                              i.value.toString());
        }
    }
}

Oddly, it looks like it should actually work with the binary format though…

I’d put some breakpoints in var::readFromStream/var::writeToStream to see what’s going on.


#3

Yes, that’s what I meant, because the xml writing jasserts because it doesn’t support it, I would expect the binary writing to do the same the thing if it doesn’t support the arrays and objects.


#4