我正在学习WCF,特别是我正在学习如何将它们写成合同,ala wscf.blue
我可以创建一个WCF客户端/服务合同的最后一种方式(微软)我可以创建一个WCF客户端/服务合同的第一种方式(WSCF)
但是,如果我创建合同第一个服务,然后尝试添加Microsoft方式(服务参考)而不是WSCF.blue方式(共享合同和生成客户端)它不起作用.
它会抛出一条ActionNotSupportedException消息The message with Action 'urn:test-com:simple:testMethodIn' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
我不知道这意味着什么.
这是我的测试合同:
SimpleModel.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="urn:test-com:simple" xmlns:mstns="urn:test-com:simple" …Run Code Online (Sandbox Code Playgroud) 我刚刚将包含WinForms,通用库和Web应用程序的VS 2008解决方案升级到VS 2010,但所有项目仍然针对.NET 3.5 SP 1.我使用此技术为我的常用库生成XmlSerializers.WinForms应用程序运行正常.当我的Web应用程序尝试使用引用相同XmlSerializers的这些库运行时,它会抛出以下内容:
'/ WebSubscribers'应用程序中的服务器错误.无法加载文件或程序集"Ceoimage.Basecamp.XmlSerializers"或其依赖项之一.此程序集由比当前加载的运行时更新的运行时构建,无法加载.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.BadImageFormatException:无法加载文件或程序集"Ceoimage.Basecamp.XmlSerializers"或其依赖项之一.此程序集由比当前加载的运行时更新的运行时构建,无法加载.
我已经使用.NET Reflector查看了XmlSerializer的引用,并看到它引用了2.0和4.0版本mscorlib以及3.5和4.0版本System.Data.Linq.奇怪的是,它只使用4.0版本System.Xml.那可能是我的问题.
如何使用这些XmlSerializers运行Web应用程序?当我简单地删除那些XmlSerializers时,Web应用程序运行正常.这是一个选项,但是如何强制MSBUILD为特定版本的CLR创建序列化程序?
这是我添加到项目文件的MSBuild任务,它强制创建XmlSerializers:
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
<Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>
Run Code Online (Sandbox Code Playgroud) msbuild sgen visual-studio-2010 .net-reflector xmlserializer
我正在尝试使用XmlSerializer来持久化List(T),其中T是一个接口.序列化器不喜欢接口.我很好奇是否有一种简单的方法可以使用XmlSerializer轻松地序列化异构对象列表.这就是我想要的:
public interface IAnimal
{
int Age();
}
public class Dog : IAnimal
{
public int Age()
{
return 1;
}
}
public class Cat : IAnimal
{
public int Age()
{
return 1;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
var animals = new List<IAnimal>
{
new Dog(),
new Cat()
};
var x = new XmlSerializer(animals.GetType());
var b = new StringBuilder();
var w = XmlTextWriter.Create(b, new XmlWriterSettings { NewLineChars = "\r\n", Indent = true });
//FAIL - …Run Code Online (Sandbox Code Playgroud) 我的应用程序使用XmlSerializer保存一个类,然后在需要时通过再次反序列化来创建一个实例.我想在我的构造函数逻辑中使用我的类的一些属性成员(在反序列化期间分配).可以假设首先分配属性,并且一旦分配了所有属性,就会调用构造函数吗?
继续讨论这个主题,是否有关于反序列化过程中发生的事件序列的文档?
我注意到XmlSerializer和通用列表(特别是List<int>)的奇怪行为.我想知道是否有人以前见过这个或知道发生了什么.看起来好像序列化工作正常但反序列化想要在列表中添加额外的项目.下面的代码演示了这个问题.
可序列化类:
public class ListTest
{
public int[] Array { get; set; }
public List<int> List { get; set; }
public ListTest()
{
Array = new[] {1, 2, 3, 4};
List = new List<int>(Array);
}
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
ListTest listTest = new ListTest();
Debug.WriteLine("Initial Array: {0}", (object)String.Join(", ", listTest.Array));
Debug.WriteLine("Initial List: {0}", (object)String.Join(", ", listTest.List));
XmlSerializer serializer = new XmlSerializer(typeof(ListTest));
StringBuilder xml = new StringBuilder();
using(TextWriter writer = new StringWriter(xml))
{
serializer.Serialize(writer, listTest);
}
Debug.WriteLine("XML: {0}", (object)xml.ToString());
using(TextReader reader …Run Code Online (Sandbox Code Playgroud) 编辑此代码应说明整个问题:
[XmlInclude(typeof(AThing1))]
public abstract class AThing
{
public abstract string Name { get; set; }
}
[XmlInclude(typeof(IThing1))]
public interface IThing
{
string Name { get; set; }
}
public class AThing1 : AThing
{
public override string Name { get; set; }
}
public class IThing1 : IThing
{
public string Name { get; set; }
}
List<AThing> aThings = new List<AThing>(new AThing[] { new AThing1() { Name = "Bob" } });
List<IThing> iThings = new List<IThing>(new IThing[] { …Run Code Online (Sandbox Code Playgroud) 我在C#中使用XmlSerializer遇到了一些令人惊讶的行为.考虑以下代码.
public class A : IEnumerable
{
public class B
{
[XmlAttribute]
public string PropA { get; set; }
[XmlElement]
public string PropB { get; set; }
}
public IEnumerator GetEnumerator ()
{
yield break;
}
}
class Program
{
static void Main (string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(A.B));
XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我尝试序列化嵌套类AB的实例,它本身不以任何方式使用容器类A. 但是当我尝试为它构造XmlSerializer时,抛出以下异常:
InvalidOperationException未处理:
要成为XML可序列化,从IEnumerable继承的类型必须在其继承层次结构的所有级别都具有Add(System.Object)的实现.Test.A没有实现Add(System.Object).
当我实际尝试序列化类型AB时,XmlSerializer正在尝试对类型A应用序列化约束我的理解是,除了在外部类型的实例中对数据的特权访问之外,嵌套类型不是特殊的并且表现得好像它是在命名空间中.
这种理解是不正确的,并且嵌套类型或XmlSerializer的语义是否证明了这种行为,或者这是否像XmlSerializer中的错误一样?
特别是对于XmlSerializer语义,是否有任何文档要求在针对嵌套类型应用时对所有外部类型强制执行XmlSerializer约束?
我有这门课:
public class MySerializableClass
{
public List<MyObject> MyList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果MySerializableClass被序列化时MyList为null,那么当它反序列化时我需要将它置为null,但是当它反序列化我的类时,XmlSerializer总是初始化它.
有没有办法避免它初始化null属性?
当它为空时,MyList甚至不会记录在序列化文件中.当我使用空值加载它并再次保存时,MyList不再为null,它被序列化为包含0项的List <>,但不是null.
谢谢.
更多信息:
由于类的结构中存在一些代码限制,IsDeserializing属性不可行
我已经在这个上浪费了几个小时:
XmlSerializer serializer;
Run Code Online (Sandbox Code Playgroud)
是的,就在using那里,引用就在那里,我使用.NET 4.0在VS2010中制作了整个解决方案,所以它不是那些东西.如果我进入对象资源管理器,我可以XmlSerializer在正确的命名空间中找到我想要的类但是如果我尝试在我的代码文件中键入上面的行并编译我得到了可怕的
找不到类型或命名空间名称"XmlSerializer"(您是否缺少using指令或程序集引用?)
死亡警告.我也没有在IntelliSense上得到它.我看过的所有其他主题/网站都是空白的,或者我已经排除了其中一个解决方案.我错过了什么?干杯
我有一个应该序列化和反序列化的类.
但是每次去血后我都需要调用一种同步参考的方法.
无论如何,我可以实现反序列化并使用传统的反序列化,但在常规反序列化后添加对我的方法的调用?
xmlserializer ×10
c# ×8
.net ×5
interface ×1
list ×1
msbuild ×1
nested-class ×1
sgen ×1
svcutil.exe ×1
wcf ×1
wscf ×1
xml ×1