public void SerializerSettings_CanRoundtrip()
        {
            var settings = new DatasyncSerializerSettings();

            serializer.SerializerSettings = settings;
            Assert.Same(settings, serializer.SerializerSettings);
        }
Esempio n. 2
0
        public void SerializerSettings_CopiedToSerializer()
        {
            var settings = new DatasyncSerializerSettings {
                CamelCasePropertyNames = true
            };
            var options = new DatasyncClientOptions {
                SerializerSettings = settings
            };
            var client = new DatasyncClient(Endpoint, options);

            Assert.Same(settings, client.Serializer.SerializerSettings);
        }
Esempio n. 3
0
        /// <summary>
        /// Defines a table for use with offline sync.
        /// </summary>
        /// <typeparam name="T">The type of entity stored in the table.</typeparam>
        /// <param name="store">The offline store.</param>
        /// <param name="tableName">The name of the table.</param>
        /// <param name="settings">The serializer settings.</param>
        public static void DefineTable <T>(this AbstractOfflineStore store, string tableName, DatasyncSerializerSettings settings)
        {
            if (settings.ContractResolver.ResolveContract(typeof(T)) is not JsonObjectContract contract)
            {
                throw new ArgumentException($"The generic type '{typeof(T).Name}' is not an object");
            }
            if (contract.DefaultCreator == null)
            {
                throw new ArgumentException($"The generic type '{typeof(T).Name}' does not have a parameterless constructor.");
            }

            object definition = contract.DefaultCreator();

            // Set enum values to their default.
            foreach (JsonProperty contractProperty in contract.Properties)
            {
                if (contractProperty.PropertyType.GetTypeInfo().IsEnum)
                {
                    object firstValue = Enum.GetValues(contractProperty.PropertyType).Cast <object>().FirstOrDefault();
                    if (firstValue != null)
                    {
                        contractProperty.ValueProvider.SetValue(definition, firstValue);
                    }
                }
            }

            // Create a JObject out of the definition.
            string  json           = JsonConvert.SerializeObject(definition, settings);
            JObject jsonDefinition = JsonConvert.DeserializeObject <JObject>(json, settings);

            // Ensure we have an ID field.
            jsonDefinition[SystemProperties.JsonIdProperty] = string.Empty;

            // Set anything with a null in it to the appropriate type.
            foreach (JProperty prop in jsonDefinition.Properties().Where(i => i.Value.Type == JTokenType.Null))
            {
                JsonProperty cprop = contract.Properties[prop.Name];
                if (cprop.PropertyType == typeof(string) || cprop.PropertyType == typeof(Uri))
                {
                    jsonDefinition[prop.Name] = string.Empty;
                }
                else if (cprop.PropertyType == typeof(byte[]))
                {
                    jsonDefinition[prop.Name] = Array.Empty <byte>();
                }
                else if (cprop.PropertyType.GetTypeInfo().IsGenericType&& cprop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>))
                {
                    jsonDefinition[prop.Name] = new JValue(Activator.CreateInstance(cprop.PropertyType.GenericTypeArguments[0]));
                }
                else
                {
                    jsonDefinition[prop.Name] = new JObject();
                }
            }

            store.DefineTable(tableName, jsonDefinition);
        }
Esempio n. 4
0
 /// <summary>
 /// Defines a table for use with offline sync.
 /// </summary>
 /// <typeparam name="T">The type of entity stored in the table.</typeparam>
 /// <param name="store">The offline store.</param>
 /// <param name="settings">The serializer settings.</param>
 public static void DefineTable <T>(this AbstractOfflineStore store, DatasyncSerializerSettings settings)
 => DefineTable <T>(store, settings.ContractResolver.ResolveTableName(typeof(T)), settings);
Esempio n. 5
0
 public DatasyncSerializerSettings_Tests()
 {
     settings         = new();
     contractResolver = settings.ContractResolver;
 }