有人能帮忙吗?
我有一个将对象转换为数据集的方法。在这种情况下,对象是使用LIST的集合类的集合
以下是代码,但它会出现以下错误,位于XmlSerializer formatter= ...行:
错误如下:
反映类型“System.Collections.Generic.List`1[MyNameSpace.Model.InformeVehiculo]”时出错。
public static DataSet TransformObjectToDataSet(System.Type type, object datos, string nombre)
{
XmlSerializer formatter = new XmlSerializer(type, "Coleccion" + nombre);
MemoryStream buffer = new MemoryStream();
formatter.Serialize(buffer, datos);
buffer.Position = 0;
DataSet dtsDatos = new DataSet(nombre);
dtsDatos.ReadXml(buffer);
return dtsDatos;
}
我正在这样调用方法
TransformObjectToDataSet(typeof(List<InformeVehiculo>), objColeccionInformeVehiculo, "ColeccionInformeVehiculo");
objColeccionInformeVehiculo是一个列表
我有点迷失了,有没有人知道它为什么失败了
编辑
在进一步查看InnerExeption后,最后一个显示如下内容
{"Cannot serialize member MyNameSpace.Model.ObjectChangeTracker.ObjectsRemovedFromCollectionProperties of type MyNameSpace.Model.ObjectsRemovedFromCollectionProperties, because it implements IDictionary."}
实际上,在InformeVehiculo内部,我已经扩展它以持有对InformeContrato的引用(使用partial classes,这是由entity framework最初创建的模型)
InformeContrato是出现问题的地方。
这是我的类:
public partial class InformeContrato : IObjectWithChangeTracker, INotifyPropertyChanged
与实体框架创建的部分类InformeVehiculo不同,InformeContrato不存在。因此,我手动创建了InformeContrato并插入了changeTracking相关内容。
在下面,我复制了一个由实体框架创建的MODEL中的区域。
#region ChangeTracking
protected virtual void OnPropertyChanged(String propertyName)
{
if (ChangeTracker.State != ObjectState.Added && ChangeTracker.State != ObjectState.Deleted)
{
ChangeTracker.State = ObjectState.Modified;
}
if (_propertyChanged != null)
{
_propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
protected virtual void OnNavigationPropertyChanged(String propertyName)
{
if (_propertyChanged != null)
{
_propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged { add { _propertyChanged += value; } remove { _propertyChanged -= value; } }
private event PropertyChangedEventHandler _propertyChanged;
private ObjectChangeTracker _changeTracker;
//[DataMember]
public ObjectChangeTracker ChangeTracker
{
get
{
if (_changeTracker == null)
{
_changeTracker = new ObjectChangeTracker();
_changeTracker.ObjectStateChanging += HandleObjectStateChanging;
}
return _changeTracker;
}
set
{
if (_changeTracker != null)
{
_changeTracker.ObjectStateChanging -= HandleObjectStateChanging;
}
_changeTracker = value;
if (_changeTracker != null)
{
_changeTracker.ObjectStateChanging += HandleObjectStateChanging;
}
}
}
private void HandleObjectStateChanging(object sender, ObjectStateChangingEventArgs e)
{
if (e.NewState == ObjectState.Deleted)
{
ClearNavigationProperties();
}
}
protected bool IsDeserializing { get; private set; }
[OnDeserializing]
public void OnDeserializingMethod(StreamingContext context)
{
IsDeserializing = true;
}
[OnDeserialized]
public void OnDeserializedMethod(StreamingContext context)
{
IsDeserializing = false;
ChangeTracker.ChangeTrackingEnabled = true;
}
protected virtual void ClearNavigationProperties()
{
//AccesorioContrato.Clear();
}
#endregion
InnerException
,如果必要的话,还要查看它的InnerException
,以此类推。通常情况下,它会非常明确地告诉你,例如类型是非公共的或缺少构造函数... 或者,给我们展示InformeVehiculo
,我们也许可以自己重现这个问题。 - Marc Gravell