XmlSerialize объект, который может быть нулем, DbNull, int, bool.строка или двойной - PullRequest
1 голос
/ 09 декабря 2011

У меня есть класс с полем object, в котором можно хранить null, DbNull, int с, string с, bool с или double с.До сих пор я смог XmlSerializer автоматически определить тип данных и правильно сериализовать мой класс, кроме случаев, когда мой object равен DbNull.

Я получаю эту ошибку: "The type System.DBNull was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.".

Какой будет самый простой обходной путь здесь?

На самом деле не так много кода, который можно показать.Это может быть мой код:

public class MyClass
{
    public object MyMultiTypesObject { get; set; }
}

MyMultiTypesObject получит значение, которое будет иметь любой из типов, которые я упомянул выше, потому что это будет преобразование из простого типа данных javascript в тип данных C #когда обрабатывается WebBrowser.AFAIK, это все типы, которые вы получите.Например, number s превращается в double s или int s, undefined превращается в null, а null превращается в DbNull.

Я сериализую егокак вы обычно сериализуете класс с XmlSerializer, вроде как:

XmlSerializer ser = new XmlSerializer(typeof(MyClass));
MyClass mc = new MyClass();
ser.Serialize(File.Create(@"C:\file.xml"), mc);

Ответы [ 2 ]

1 голос
/ 25 ноября 2014

Возможно xml сериализовать DBNull. см:

http://msdn.microsoft.com/en-us/library/ms731923(v=vs.110).aspx

Отметьте свой класс как:

[Serializable]
[System.Xml.Serialization.XmlRoot("PropertyEntry", Namespace = "", IsNullable = false)]
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public class PropertyEntry {}
1 голос
/ 09 декабря 2011

Несмотря на то, что класс System.DBNull можно сериализовать, System.DBNull имеет только один экземпляр на домен приложения.Эти типы часто называют синглетонами.Если у вас есть поле, ссылающееся на объект DBNull, его сериализация и десериализация не должны приводить к существованию нового объекта DBNull в AppDomain.Вот почему механизм сериализации по умолчанию отказывается его сериализовать.

Я думаю, у вас есть два способа:

  1. Не использовать значение DBNull в тех случаях, когда вам нужно сериализовать поля
  2. Реализация IXmlSerializable в вашем классе и создание собственного механизма сериализации

Надеюсь, эта замечательная статья поможет вам: Как правильно реализовать IXmlSerializable .

...