EF4 POCO WCF Serialization problems (no lazy loading, proxy/no proxy, circular references, etc)

后端 未结 5 1485
慢半拍i
慢半拍i 2021-02-15 12:23

OK, I want to make sure I cover my situation and everything I\'ve tried thoroughly. I\'m pretty sure what I need/want can be done, but I haven\'t quite found the perfect combin

5条回答
  •  忘掉有多难
    2021-02-15 12:52

    You can use the ApplyDataContractResolverAttribute and a ProxyDataContractResolver along with the CyclicReferencesAwareAttribute. At first this produces error like this one - as if there is no DataContractResolver specified at all:

    Type 'System.Data.Entity.DynamicProxies.Whatever_E6......A9' with data contract name 'Whatever_E6......A9:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

    It will work with one simple change.

    In the ApplyCyclicDataContractSerializerOperationBehavior, the constructors for the DataContractSerializer must also pass in the DataContractResolver. This is left out of all the versions I have seen online.

    Example:

    public class ApplyCyclicDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
    {
        private readonly Int32 _maxItemsInObjectGraph;
        private readonly bool _ignoreExtensionDataObject;
    
        public ApplyCyclicDataContractSerializerOperationBehavior(OperationDescription operationDescription, Int32 maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences)
            : base(operationDescription)
        {
            _maxItemsInObjectGraph = maxItemsInObjectGraph;
            _ignoreExtensionDataObject = ignoreExtensionDataObject;
        }
    
        public override XmlObjectSerializer CreateSerializer(Type type, String name, String ns, IList knownTypes)
        {
            return new DataContractSerializer(type, name, ns, knownTypes, 
                _maxItemsInObjectGraph, 
                _ignoreExtensionDataObject, 
                true, 
                null /*dataContractSurrogate*/, 
                DataContractResolver); // <-----------------------------
        }
    
        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList knownTypes)
        {
            return new DataContractSerializer(type, name, ns, knownTypes, 
                _maxItemsInObjectGraph, 
                _ignoreExtensionDataObject, 
                true, 
                null /*dataContractSurrogate*/, 
                DataContractResolver); // <-----------------------------
        }
    }
    

提交回复
热议问题