2015-10-09 6 views
2

Я попытался сериализовать назначение в JSON в пользовательском действии.Сериализация JSON Dynamics CRM

Вот класс для Назначения:

//<summary> 
// Commitment representing a time interval with start/end times and duration. 
// </summary> 
// 
[System.Runtime.Serialization.DataContractAttribute()] 
[Microsoft.Xrm.Sdk.Client.EntityLogicalNameAttribute("appointment")] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("CrmSvcUtil", "7.1.0001.3108")] 
public partial class Appointment : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged 
{ 

// <summary> 
// Default Constructor. 
// </summary> 
public Appointment() : 
     base(EntityLogicalName) 
{ 
} 

public const string EntityLogicalName = "appointment"; 

public const int EntityTypeCode = 4201; 

public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging; 

private void OnPropertyChanged(string propertyName) 
{ 
    if ((this.PropertyChanged != null)) 
    { 
     this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
    } 
} 
.... 

А вот код сериализации:

Entity entity = (Entity) context.InputParameters["Target"]; 

     ColumnSet csAll = new ColumnSet(true); 
     Appointment appointment = (Appointment) service.Retrieve(entity.LogicalName, entity.Id, csAll); 

     System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Appointment)); 
     MemoryStream ms = new MemoryStream(); 
     serializer.WriteObject(ms, appointment); 
     string jsonNotification = Encoding.Default.GetString(ms.ToArray()); 

И когда активность исполняется, у меня есть следующее сообщение об ошибке:

Неожиданное исключение из плагина (Выполнение): SmartwatchMeeting_PushGCM.SmartwatchMeeting: System.Security.SecurityException: Тип контракта данных «System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Version = 4.0.0.0, культура = нейтральной, PublicKeyToken = b77a5csadsad089], [System. Объект, mscorlib, Version = 4.0.0.0, культура = нейтральной, PublicKeyToken = b77a5csadsad089]]» не может быть сериализовать в режиме частичного доверия, так как член 'ключ' не общественного

Я не понимаю, что Я должен добавить, чтобы он работал?

Спасибо за вашу помощь

ответ

1

Вы не можете сериализовать непубличные члены типов, так как песочница навязывает частичное доверие, и сериализатор использует отражение.

Вы можете:

  • Переключить на Isolation mode: None (On-Premise только)
  • Написать класс модели для ваших данных, только с public членов, и оберните запись. Это делает ваш код более крупным, но работает в Isolation mode: Sandbox
+0

Я нахожусь в Dynamics CRM Online, так что это будет вторая альтернатива. Нужно ли мне редактировать класс, созданный CrmSvcUtil? Эта строка [System.Runtime.Serialization.DataContractAttribute()] не разрешает сериализацию? Спасибо – bidou88

+0

Я уверен, что изменение автоматически сгенерированного кода сломает его, но я никогда не использую его, поэтому я не могу сказать точно. То, что я предлагаю, является обычным классом оболочки. – Alex

+1

Хорошо, спасибо. Дело в том, что я хочу сериализовать весь объект Appointment, который довольно велик. Что вы думаете об использовании Newtonsoft.Json.dll и объединить его после сборки? – bidou88