2012-03-06 35 views
7
public static string GetXml(Dictionary<string, object> parameters) 
{ 
    return XamlWriter.Save(parameters); 
} 

上述語句返回NotSupportedExceptionTFS 2010:爲什麼不可能反序列化詞典<串,對象>與XamlWriter.Save當我可以使用XamlReader爲解串

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

public static Dictionary<string, object> 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<string, object>) XamlReader.Load(xmlTextReader); 
     } 
    } 
} 

的XML:

<?xml version="1.0" ?> 
<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <mtbwa:BuildSettings ProjectsToBuild="$/XXX/Product/Company.XXX.Common/Company.XXX.Common.Basic/Company.XXX.Common.Basic.csproj" x:Key="BuildSettings"> 

    <mtbwa:BuildSettings.PlatformConfigurations> 

     <mtbwa:PlatformConfigurationList Capacity="4"> 

     <mtbwa:PlatformConfiguration Configuration="DEMO" Platform="AnyCPU"/> 

     <mtbwa:PlatformConfiguration Configuration="Release" Platform="AnyCPU"/> 

     </mtbwa:PlatformConfigurationList> 

    </mtbwa:BuildSettings.PlatformConfigurations> 

    </mtbwa:BuildSettings> 

    <mtbwa:TestSpecList Capacity="0" x:Key="TestSpecs"/> 

    <x:String x:Key="BuildNumberFormat"> 
    $(BuildDefinitionName) 6.0.0$(Rev:.r) 
    </x:String> 

    <mtbwa:CodeAnalysisOption x:Key="RunCodeAnalysis"> 
    Never 
    </mtbwa:CodeAnalysisOption> 

    <mtbwa:AgentSettings MaxWaitTime="00:15:00" TagComparison="MatchExactly" Tags="" x:Key="AgentSettings"/> 

    <x:Boolean x:Key="AssociateChangesetsAndWorkItems"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="CreateWorkItem"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="PerformTestImpactAnalysis"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="CreateLabel"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="DisableTests"> 
    True 
    </x:Boolean> 

    <x:Boolean x:Key="DoCheckinAssemblyInfoFiles"> 
    True 
    </x:Boolean> 

    <x:String x:Key="AssemblyVersionPattern"> 
    6.0.0.0 
    </x:String> 

    <x:String x:Key="AssemblyFileVersionPattern"> 
    6.0.0.B 
    </x:String> 

    <x:Boolean x:Key="UseObfuscation"> 
    True 
    </x:Boolean> 

    <x:String x:Key="ObfuscatorFilePath"> 
    C:\Program Files (x86)\LogicNP Software\Crypto Obfuscator For .Net 2011 R3\co.exe 
    </x:String> 

    <x:String x:Key="ObfuscatorProjectFile"> 
    $/XXX/Product/BuildProcess/Company.XXX.ZZZ.obproj 
    </x:String> 

    <x:String x:Key="ProjectPath"> 
    $/XXX/Product/Company.XXX.Common 
    </x:String> 

</Dictionary> 

回答

2

我以前JetBrains dotPeek找出微軟是如何序列化和反序列化的TFS 2010工作流Dictionary<string, object>

對於反序列化,他們使用:Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)

序列化,他們使用:WorkflowHelpers.SerializeProcessParameters(IDictionary<string, object> parameterValues)

大會: Microsoft.TeamFoundation.Build.Workflow.dll

我原來的問題是,在排隊構建之前,我嘗試添加IBuildRequest.ProcessParameters值。

private static void SetProcessParametersForSubBuild(IBuildRequest buildRequest, Dictionary<string, object> 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); 
    } 
} 

隊列體形:

變種queuedBuild = buildServer.QueueBuild(buildRequest);

1

是它必須使用XamlReader /的XamlWriter?如果沒有 - 看一看的DataContractSerializer:

public static class SerializationExtensions 
{ 
    public static string Serialize<T>(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<T>(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

+0

不,它不是必須的,但它是必須得到相同的模式。使用DataContractSerializer更改模式。 – Rookian 2012-03-07 09:03:38

相關問題