Добрый день, уважаемые!
У меня есть пара небольших проблем:
1. Есть наследник типизированного DataSet, в который я добавил public-поле — класс. При этом XmlSerializer на него никак не отреагировал, то есть продолжил сериализовать как и базовый класс. Я переописал IXmlSerializable, но обнаружилась ситуация, когда вместо развернутого xml из датасета сериализуется какой-то куцый кусок (в котором, в принципе, данные все есть, но нет дополнительной информации наподобие diffgr:diffgram). Хотелось бы, чтобы мой классик как-нибудь поорганичнее вписался в имеемую структуру, куда копать?
2. Для этого самого классика я также переописал IXmlSerializable. Теперь наблюдаю такое поведение: когда класс сериализуется сам по себе, то xml обрамляется корневым тегом из имени класса. Если же я сериализую его как поле другого класса — корневой элемент не пишется. Поэтому приходится писать его руками в WriteXml и при сериализации самого класса получается ненужное дублирование. Подскажите, что можно предпринять?
[Serializable]
[XmlSchemaProvider("GetDocumentBaseSchema")]
public abstract class DocumentBase : IXmlSerializable
{
public virtual void ReadXml(System.Xml.XmlReader reader)
{
reader.ReadStartElement("version", XmlService.mseNamespace);
_ID = Convert.ToInt32(reader.ReadElementString("ID"));
reader.ReadEndElement();
}
public virtual void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteStartElement("version", XmlService.mseNamespace);
writer.WriteElementString("ID", _ID.ToString());
writer.WriteEndElement();
}
public static XmlQualifiedName GetDocumentBaseSchema(XmlSchemaSet xs)
{
xs.Add(DocumentBaseSchema);
return new XmlQualifiedName("version", XmlService.mseNamespace);
}
public static XmlSchema DocumentBaseSchema
{
get
{
XmlSchema result = new XmlSchema();
result.ElementFormDefault = XmlSchemaForm.Qualified;
result.Namespaces.Add("xs", XmlService.xsNamespace);
result.TargetNamespace = XmlService.mseNamespace;
XmlSchemaSequence ss = new XmlSchemaSequence();
XmlSchemaElement xe = new XmlSchemaElement();
xe.Name = "ID";
xe.SchemaTypeName = new XmlQualifiedName("int", XmlService.xsNamespace);
ss.Items.Add(xe);
XmlSchemaComplexType sc = new XmlSchemaComplexType();
sc.Name = "version";
sc.Particle = ss;
result.Items.Add(sc);
return result;
}
}
}
[Serializable]
[XmlSchemaProvider("GetProjectSchema")]
public class Project : DocumentBase, IXmlSerializable
{
public override void ReadXml(System.Xml.XmlReader reader)
{
reader.ReadStartElement("project", XmlService.mseNamespace);
base.ReadXml(reader);
_path = reader.ReadElementString("path");
reader.ReadEndElement();
}
public override void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteStartElement("project", XmlService.mseNamespace);
base.WriteXml(writer);
writer.WriteElementString("path", _path);
writer.WriteEndElement();
}
public static XmlQualifiedName GetProjectSchema(XmlSchemaSet xs)
{
xs.Add(ProjectSchema);
return new XmlQualifiedName("project", XmlService.mseNamespace);
}
public static XmlSchema ProjectSchema
{
get
{
XmlSchema result = new XmlSchema();
result.ElementFormDefault = XmlSchemaForm.Qualified;
result.Namespaces.Add("xs", XmlService.xsNamespace);
result.Namespaces.Add("mse", XmlService.mseNamespace);
result.TargetNamespace = XmlService.mseNamespace;
XmlSchemaInclude xi = new XmlSchemaInclude();
xi.Schema = DocumentBaseSchema;
xi.SchemaLocation = "DocumentBase.xsd";
result.Includes.Add(xi);
XmlSchemaSequence ss = new XmlSchemaSequence();
XmlSchemaElement xe = new XmlSchemaElement();
xe.Name = "version";
xe.SchemaTypeName = new XmlQualifiedName("version", XmlService.mseNamespace);
ss.Items.Add(xe);
xe = new XmlSchemaElement();
xe.Name = "path";
xe.SchemaTypeName = new XmlQualifiedName("string", XmlService.xsNamespace);
ss.Items.Add(xe);
XmlSchemaComplexType sc = new XmlSchemaComplexType();
sc.Name = "project";
sc.Particle = ss;
result.Items.Add(sc);
return result;
}
}
}
[Serializable]
[XmlSchemaProvider("GetProjectDataSetSchema")]
public class ProjectDataSet : ProjectDataSetBase, IXmlSerializable
{
void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
{
reader.ReadStartElement("ProjectDataSet", XmlService.mseNamespace);
base.ReadXml(reader);
_project.ReadXml(reader);
reader.ReadEndElement();
}
void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
{
base.WriteXml(writer);
_project.WriteXml(writer);
}
public static XmlQualifiedName GetProjectDataSetSchema(XmlSchemaSet xs)
{
xs.Add(ProjectDataSetSchema);
return new XmlQualifiedName("ProjectDataSet", XmlService.mseNamespace);
}
public static XmlSchema ProjectDataSetSchema
{
get
{
XmlSchema result = new XmlSchema();
result.ElementFormDefault = XmlSchemaForm.Qualified;
XmlSchema schema = (new ProjectDataSet()).GetSchemaSerializable();
XmlSchemaSequence ss = new XmlSchemaSequence();
foreach (XmlSchemaObject item in schema.Items)
ss.Items.Add(item);
result.Namespaces = schema.Namespaces;
result.Namespaces.Add("mse", XmlService.mseNamespace);
result.TargetNamespace = XmlService.mseNamespace;
XmlSchemaInclude xi = new XmlSchemaInclude();
xi.Schema = Project.ProjectSchema;
xi.SchemaLocation = "Project.xsd";
result.Includes.Add(xi);
XmlSchemaElement xe = new XmlSchemaElement();
xe.Name = "project";
xe.SchemaTypeName = new XmlQualifiedName("project", XmlService.mseNamespace);
ss.Items.Add(xe);
XmlSchemaComplexType sc = new XmlSchemaComplexType();
sc.Name = "ProjectDataSet";
sc.Particle = ss;
result.Items.Add(sc);
return result;
}
}
}