TFS 2010:当我可以使用XamlReader进行反序列化时,为什么无法使用XamlWriter.Save反序列化Dictionary

public static string GetXml(Dictionary parameters) { return XamlWriter.Save(parameters); } 

上面的语句返回NotSupportedException

奇怪的是我可以使用XamlReader来序列化字典。

 public static Dictionary GetParameters(IBuildDetail buildDetail, string buildDefinition) { var tfsProject = buildDetail.BuildDefinition.TeamProject; var buildServer = buildDetail.BuildServer; var buildDef = buildServer.GetBuildDefinition(tfsProject, buildDefinition); using (var stringReader = new StringReader(buildDef.ProcessParameters)) { using (var xmlTextReader = new XmlTextReader(stringReader)) { return (Dictionary) XamlReader.Load(xmlTextReader); } } } 

XML:

             $(BuildDefinitionName) 6.0.0$(Rev:.r)   Never    False   False   False   False   True   True   6.0.0.0   6.0.0.B   True   C:\Program Files (x86)\LogicNP Software\Crypto Obfuscator For .Net 2011 R3\co.exe   $/XXX/Product/BuildProcess/Company.XXX.ZZZ.obproj   $/XXX/Product/Company.XXX.Common   

我使用JetBrains dotPeek来了解Microsoft如何为TFS 2010 Workflow序列化和反序列化Dictionary

对于反序列化,他们使用: Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)

对于序列化,他们使用: WorkflowHelpers.SerializeProcessParameters(IDictionary parameterValues)

程序集: Microsoft.TeamFoundation.Build.Workflow.dll

我最初的问题是我在排队构建之前尝试添加IBuildRequest.ProcessParameters值。

 private static void SetProcessParametersForSubBuild(IBuildRequest buildRequest, Dictionary processParametersForSubBuild, IBuildDefinition buildDefinition) { var subBuildProcessParameters = WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters); if (processParametersForSubBuild.Any()) { foreach (var processParameter in processParametersForSubBuild) { if (subBuildProcessParameters.ContainsKey(processParameter.Key)) { subBuildProcessParameters[processParameter.Key] = processParameter.Value; } else { subBuildProcessParameters.Add(processParameter.Key, processParameter.Value); } } buildRequest.ProcessParameters = WorkflowHelpers.SerializeProcessParameters(subBuildProcessParameters); } } 

队列构建:

var queuedBuild = buildServer.QueueBuild(buildRequest);

是否必须使用XamlReader / XamlWriter? 如果没有 – 看看DataContractSerializer:

 public static class SerializationExtensions { public static string Serialize(this T obj) { var serializer = new DataContractSerializer(obj.GetType()); using (var writer = new StringWriter()) using (var stm = new XmlTextWriter(writer)) { serializer.WriteObject(stm, obj); return writer.ToString(); } } public static T Deserialize(this string serialized) { var serializer = new DataContractSerializer(typeof(T)); using (var reader = new StringReader(serialized)) using (var stm = new XmlTextReader(reader)) { return (T)serializer.ReadObject(stm); } } } 

(信用到https://stackoverflow.com/a/5941122/1246870 )