in tools/simpleresgen/mono/ResXResourceWriter.cs [501:593]
public void AddMetadata (string name, object value)
{
if (value is string) {
AddMetadata (name, (string)value);
return;
}
if (value is byte[]) {
AddMetadata (name, (byte[])value);
return;
}
if (name == null)
throw new ArgumentNullException ("name");
if (value == null)
throw new ArgumentNullException ("value");
if (!value.GetType ().IsSerializable)
throw new InvalidOperationException (String.Format ("The element '{0}' of type '{1}' is not serializable.", name, value.GetType ().Name));
if (written)
throw new InvalidOperationException ("The resource is already generated.");
if (writer == null)
InitWriter ();
Type type = value.GetType ();
TypeConverter converter = TypeDescriptor.GetConverter (value);
if (converter != null && converter.CanConvertTo (typeof (string)) && converter.CanConvertFrom (typeof (string))) {
string str = (string)converter.ConvertToInvariantString (value);
writer.WriteStartElement ("metadata");
writer.WriteAttributeString ("name", name);
if (type != null)
writer.WriteAttributeString ("type", type.AssemblyQualifiedName);
writer.WriteStartElement ("value");
writer.WriteString (str);
writer.WriteEndElement ();
writer.WriteEndElement ();
writer.WriteWhitespace ("\n ");
return;
}
if (converter != null && converter.CanConvertTo (typeof (byte[])) && converter.CanConvertFrom (typeof (byte[]))) {
byte[] b = (byte[])converter.ConvertTo (value, typeof (byte[]));
writer.WriteStartElement ("metadata");
writer.WriteAttributeString ("name", name);
if (type != null) {
writer.WriteAttributeString ("type", type.AssemblyQualifiedName);
writer.WriteAttributeString ("mimetype", ByteArraySerializedObjectMimeType);
writer.WriteStartElement ("value");
WriteNiceBase64 (b, 0, b.Length);
} else {
writer.WriteAttributeString ("mimetype", BinSerializedObjectMimeType);
writer.WriteStartElement ("value");
writer.WriteBase64 (b, 0, b.Length);
}
writer.WriteEndElement ();
writer.WriteEndElement ();
return;
}
MemoryStream ms = new MemoryStream ();
BinaryFormatter fmt = new BinaryFormatter ();
try {
fmt.Serialize (ms, value);
} catch (Exception e) {
throw new InvalidOperationException ("Cannot add a " + value.GetType () +
"because it cannot be serialized: " +
e.Message);
}
writer.WriteStartElement ("metadata");
writer.WriteAttributeString ("name", name);
if (type != null) {
writer.WriteAttributeString ("type", type.AssemblyQualifiedName);
writer.WriteAttributeString ("mimetype", ByteArraySerializedObjectMimeType);
writer.WriteStartElement ("value");
WriteNiceBase64 (ms.GetBuffer (), 0, ms.GetBuffer ().Length);
} else {
writer.WriteAttributeString ("mimetype", BinSerializedObjectMimeType);
writer.WriteStartElement ("value");
writer.WriteBase64 (ms.GetBuffer (), 0, ms.GetBuffer ().Length);
}
writer.WriteEndElement ();
writer.WriteEndElement ();
ms.Close ();
}