private void WriteReferencedElement(string name, string ns, object o, Type ambientType)
{
if (name == null) name = String.Empty;
Type t = o.GetType();
if (t.IsArray || typeof(IEnumerable).IsAssignableFrom(t))
{
WriteArray(name, ns, o, t);
}
else
{
TypeEntry entry = GetTypeEntry(t);
if (entry == null) throw CreateUnknownTypeException(t);
WriteStartElement(name.Length == 0 ? entry.typeName : name, ns == null ? entry.typeNs : ns, null, true);
WriteId(o, false);
if (ambientType != t) WriteXsiType(entry.typeName, entry.typeNs);
entry.callback(o);
_w.WriteEndElement();
}
}